Как защитить приложения от ошибок в модуле DLL - PullRequest
1 голос
/ 10 марта 2010

У меня есть DLL и приложение, которое будет вызывать некоторые функции в этой DLL. Например ...

Функция DLL:

char const* func1() 
{ 
    return reinterpret_cast<char const*>(0x11223344); 
}

Код приложения:

func1 = reinterpret_cast<Func1Callback>(::GetProcAddress(hDll, "func1"));
blablabla
char const* ptr = func1();
cout << ptr;

Эта DLL не находится под моим контролем (плагин) .. Тот же код вызовет нарушение прав доступа в моем приложении, так что ... Есть ли механизм, который позволит определять такие ошибки?

Ответы [ 4 ]

1 голос
/ 10 марта 2010

Поскольку DLL может делать все, что могла бы делать ваша программа, единственный надежный способ - это загрузить ее в отдельный упрощенный рабочий процесс, а когда что-то случится, просто перезапустите процесс. Вам понадобится протокол для передачи данных в рабочий процесс и получения результатов.

1 голос
/ 10 марта 2010

DLL загружается в адресное пространство вашего процесса. Если он обращается к какой-то неверной ячейке памяти, ваш процесс завершится сбоем. Я не вижу другого пути, кроме как вообще не использовать эту dll.

0 голосов
/ 10 марта 2010

Вы можете заключить вызов функции в блок try catch, это поможет не разрушить все приложение прямо при вызове функции, но никто не может гарантировать, что загруженная dll не изменит память где-то в вашем коде, в этом случае вы трудно отлаживать сбой в другом месте. Таким образом, вы, вероятно, можете повысить защиту только от нарушения прав доступа, но в любом случае не сможете полностью защитить ваше приложение от некоторых побочных эффектов.

0 голосов
/ 10 марта 2010

Если DLL возвращает адреса ненужной памяти вашему приложению, я бы сказал, что вы не должны ее использовать, потому что она не выполняет свою намеченную / желаемую функцию.

Кроме того, не пытайтесь защититься от него, используя класс функций Win32 IsBad * Ptr, как указано в документации MSDN (см. Также этот пост Раймонда Чена для хорошего описания почему бы и нет ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...