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 :))
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. –