2013-04-03 34 views
8

Tôi đang thiết kế một hệ thống trong C/C++ có thể mở rộng với tất cả các loại plugin. Có một API công khai C được xác định rõ, hầu hết hoạt động với (const) char* và các loại con trỏ khác. Các plugin được biên dịch thành các tệp .so hoặc .dll và ứng dụng chính tải chúng khi khởi động và sau đó tải hoặc tải lại chúng theo yêu cầu.Chạy plugin trong hộp cát

Các plugin có thể đến từ nhiều nguồn khác nhau, đáng tin cậy hay không nên :)

Bây giờ, tôi muốn làm cho chắc chắn, rằng nếu một plugin làm điều gì đó ngu ngốc (chẳng hạn như cố gắng để giải phóng một ký ức mà ông không phải là miễn phí), hành động này không làm giảm toàn bộ hệ thống, nhưng chỉ đơn thuần là thông báo hệ thống chính về trình cắm không đúng cho nó để loại bỏ nó khỏi hàng đợi.

Mã cuộc gọi đang được thực hiện theo cách sau đây:

const char* data = get_my_data(); 
for(int i = 0; i<plugins; i++) 
{ 
    plugins[i]->execute(data); 
} 

nhưng nếu plugin[0] giải phóng "một cách tình cờ" chuỗi dữ liệu hoặc ghi đè lên nó hoặc do nhầm lẫn nhảy để giải quyết 0x0 này sẽ mang xuống toàn bộ hệ thống và tôi không muốn điều này. Làm thế nào tôi có thể tránh được loại thảm họa này. (Tôi biết, tôi có thể sao chép chuỗi data ... điều này không giải quyết được vấn đề của tôi :))

+0

Câu trả lời của tôi có giúp bạn giải quyết vấn đề này không? Nếu có, vui lòng chấp nhận nó làm câu trả lời đúng. –

Trả lời

12

Thực hiện quy trình bao bọc cho plugin và liên lạc với trình bao bọc đó thông qua IPC. Trong trường hợp lỗi plugin, quy trình chính của bạn sẽ bị ảnh hưởng

0

Nói một cách đơn giản, bạn không thể thực hiện điều đó trong cùng một quy trình. Nếu các plugin của bạn được viết bằng C hoặc C++, chúng có thể chứa nhiều nguồn hành vi không xác định, nghĩa là nguồn cho các sự cố không thể tránh khỏi bị lỗi. Vì vậy, bạn nên khởi chạy các plugin trong các quy trình của riêng chúng như kassak được đề xuất và để chúng bị lỗi nếu muốn hoặc sử dụng ngôn ngữ khác cho các plugin của bạn, ví dụ: một số ngôn ngữ kịch bản intepreted như lua.

-1

Có một cái nhìn tại http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

tôi sử dụng/EHA tại một trong những dự án của tôi để giúp tôi bắt ngoại lệ từ các thư viện mà làm ngu ngốc thứ. Nếu bạn biên dịch mã của bạn với cài đặt này, khối catch try bình thường sẽ bắt ngoại lệ như devide by zero, v.v.

Không chắc chắn nếu có một số tương đương với điều này trên Linux - hãy cho tôi biết nếu có ..

Các vấn đề liên quan