Небезопасно генерировать исключения из статически связанных библиотек C ++? - PullRequest
5 голосов
/ 12 августа 2010

Я слышал, что создание исключений в / из библиотеки C ++ может быть потенциально опасным, особенно с DLL, и особенно если вызывающий код и библиотека скомпилированы с разными компиляторами.Есть ли правда в этом?Это безопасно, пока я придерживаюсь статических библиотек?Заметьте, что я не говорю о внутреннем использовании исключений только в библиотеке, я хочу добавить их глубоко в вызывающий код :)

Просто чтобы уточнить: скажем, у меня есть скомпилированная статическая библиотека, которая определяет классВот так:

class Foo
{
public:
    // Constructor
    Foo()
    {
        /* ... Do stuff ... */        
        if (stuffwentwrong)
            throw(123); // We throw an integer error code (to make it simple) 
    }
};

И какой-то парень использует это так:

try 
{
    Foo foo_object;
}
catch (int i)
{
    std::cout << "Oh bum. Code: " << i; 
}

Это было бы безопасно?

Ответы [ 4 ]

3 голосов
/ 13 августа 2010

Что касается GCC, существует по крайней мере один случай, когда перехват исключений из общих библиотек, сгенерированных GCC, может быть проблематичным, т.е. если вы забыли экспортировать тип throw в общей библиотеке, когда видимость символа равна "hidden" по умолчанию. Страница GCC Visibility Wiki содержит подробную информацию о проблеме и способах ее предотвращения.

Я не уверен, что в DLL-библиотеках Windows есть похожие проблемы, но, скорее всего, это так.

3 голосов
/ 12 августа 2010

и особенно если вызывающий код и библиотека скомпилированы с разными компиляторами

Обычно вы не можете смешивать разные компиляторы C ++, которые не имеют совместимого ABI.Так, например, вы не можете выбросить исключение из библиотеки, скомпилированной с MSVC, и попытаться перехватить ее с помощью GCC.

Но в остальном у вас обычно нет проблем.

Небольшое примечание:

MSVC имеет несколько несовместимых моделей исключений, не смешивайте их.

1 голос
/ 14 августа 2010

Общее замечание, когда дело доходит до DLL и исключений:

Не используйте встроенный класс исключений в заголовке. В итоге вы получите дублирующиеся таблицы и информацию RTTI, в результате чего исключения не будут перехвачены при использовании кода (из-за дублирования исключение считается другого типа).

Детали:

http://marcmutz.wordpress.com/2010/08/04/fun-with-exceptions/

0 голосов
/ 12 августа 2010

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

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