c ++ динамическая библиотека segfault - PullRequest
3 голосов
/ 09 июня 2011

Я пишу сетевое приложение на c ++ и хочу включить создание плагинов, но я не знаю, что делать, чтобы защитить свое приложение от ошибок, таких как segfault. Например: У меня есть интерфейс:

class IPlugin{
public:
  IPlugin();
  virtual ~IPlugin();
  virtual void callPlugin() = 0;
}

А кто-то напишет динамическую библиотеку:

class Plugin : public IPlugin{
public:
  Plugin();
  virtual ~Plugin();
  virtual void callPlugin();
}

void Plugin::callPlugin(){
  int* a = NULL;
  *a = 5;
}

Вызов этой функции в моем приложении закончится завершением всего. Я знаю, что могу использовать fork (), но функции в плагинах будут короткими и будут использоваться много раз, поэтому я думаю, что fork () слишком медленный. Есть идеи?

PS. И извините за мой английский.

1 Ответ

5 голосов
/ 09 июня 2011

Это проигрышная битва, пытающаяся защитить вас от плохого кода, загруженного в ваше адресное пространство.Эти плагины могут нанести реальный ущерб, от которого вы никогда не сможете восстановиться.

Либо примите тот факт, что плагин с ошибками приведет к остановке вашего приложения, либо вы должны изолировать плагин в отдельном процессе, как вы предлагаете.Но вам нужно вызывать fork только один раз, когда вы загружаете плагин, не беспокойтесь о том, что это медленно.Реальная работа будет заключаться в том, чтобы общаться с плагином из вашего приложения, используя некоторую форму IPC - каналы могут быть подходящими.

...