Ich entwerfe ein System in C / C ++, das mit allen Arten von Plugins erweiterbar ist. Es gibt eine gut definierte C-API, die hauptsächlich mit (const) char*
und anderen Zeigertypen arbeitet. Die Plugins werden in .so- oder .dll-Dateien kompiliert, und die Hauptanwendung lädt sie beim Start und entlädt sie später oder lädt sie auf Anforderung neu.
Die Plugins können aus verschiedenen Quellen kommen, vertrauenswürdig oder nicht:)
Nun möchte ich sichergehen, dass, wenn ein Plugin etwas Dummes macht (wie es versucht, einen Speicher zu befreien, den er nicht freigeben sollte), diese Aktion nicht das gesamte System zum Absturz bringt, sondern lediglich den Hauptsystem über das fehlerversprechende Plugin dafür, um es aus der Warteschlange zu entfernen.
Die Codeaufrufe werden auf folgende Weise ausgeführt:
%Vor% aber wenn plugin[0]
"zufällig" den Datenstring freigibt oder ihn überschreibt oder irrtümlich auf die Adresse 0x0 springt, würde dies das gesamte System zum Absturz bringen, und das möchte ich nicht. Wie kann ich diese Art von Katastrophe vermeiden? (Ich weiß, ich kann die data
string duplizieren ... das löst mein Problem nicht :))
Einfach gesagt, Sie können das nicht im selben Prozess tun. Wenn Ihre Plugins in C oder C ++ geschrieben sind, können sie zahlreiche Quellen für undefiniertes Verhalten enthalten, also Quellen für nicht erkennbare unvermeidbare Abstürze. Also sollten Sie entweder die Plugins in ihren eigenen Prozessen wie kassak vorgeschlagen starten und sie abstürzen lassen, wenn sie wollen, oder eine andere Sprache für Ihre Plugins verwenden, z. etwas intepretierte Skriptsprache wie lua.
Schauen Sie sich Ссылка
anIch benutze / EHa in einem meiner Projekte, um Ausnahmen von Bibliotheken zu finden, die dumme Dinge tun. Wenn Sie Ihren Code mit dieser Einstellung kompilieren, fängt ein normaler try catch-Block Ausnahmen wie z. B. zerlegen, usw. an.
Nicht sicher, ob es unter Linux etwas Entsprechendes gibt - bitte lassen Sie mich wissen, wenn es da ist.