Как ошибки времени выполнения обрабатываются в библиотеке C, скомпилированной в C ++? - PullRequest
3 голосов
/ 13 декабря 2011

Предположим, у меня есть библиотека C, которую я связываю с программой на C ++ в Windows, используя Visual Studio. Эта библиотека C является черным ящиком. Если в этой библиотеке происходит фатальная ошибка (например, разыменование нулевого значения), как эта ошибка времени выполнения будет обрабатываться программой / ОС? Я знаю в C ++, что есть исключения с нулевой ссылкой, так что вы, вероятно, можете обрабатывать такие ошибки с помощью try / catch, но, поскольку это библиотека C, она не выдаст throw, верно? Так что же будет? Программа завершится, но через что значит, если не исключение C ++?

Ответы [ 3 ]

6 голосов
/ 13 декабря 2011

Вы никогда не сможете "обработать" разыменование нулевого указателя.После того, как вы это сделаете, ваша программа больше не находится в четко определенном состоянии, и невозможно продолжать детерминистически.Единственный способ действия - terminate(), который ОС любезно сделает от вашего имени, если вы не зарегистрировали обработчик SIGSEGV.

Слово «ошибка» имеет несколько значений, которые могут сбивать с толку: Вкл.С одной стороны, можно сказать, что функция, которая не может выполнить свою ожидаемую задачу, обнаружила «ошибку», и можно ожидать, что она сообщит об этом либо с помощью подходящего возвращаемого значения, либо с помощью исключения.Такое поведение может быть лучше названо fail .Нужно подготовить правильную программу для обработки всех возможных способов возврата функции.С другой стороны, есть ошибок программирования , которые просто приводят к неправильной или даже плохо сформированной программе.В правильной программе никогда не должно быть ошибок программирования.

Например, malloc() может завершиться с ошибкой (если не может найти достаточно места), о чем она сообщает, возвращая нулевой указатель, но вашПрограмма будет содержать ошибку, если она разыменовывает результат malloc() без проверки.

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

4 голосов
/ 13 декабря 2011

Разыменование нулевого указателя в собственном коде вызовет «нарушение доступа» в Windows или «ошибку сегментации» в Unix / Linux. Разные названия для одной и той же вещи. Это ЦП, который обнаруживает ошибку, и вызывает в операционной системе обработчик, который завершает процесс.

Разыменование пустой ссылки на языке виртуальной машины (например, .NET или Java) приведет к исключению, которое вы можете перехватить. Это возможно, потому что виртуальная машина находится между программой и процессором, и она может обнаружить ноль, прежде чем пытаться фактически разыменовать его.

Библиотека C является нативным кодом, поэтому вы получите нарушение прав доступа. Вы получите то же самое от настоящей программы на C ++, которая также скомпилирована в нативный код. Но если вы используете Managed C ++ или C ++ / CLI, это варианты, которые компилируются в CIL и выполняются во время выполнения .NET, поэтому в этом случае вы получаете исключение NullReferenceException.

2 голосов
/ 13 декабря 2011

Поддержка «асинхронных» или «структурированных» исключений (таких как недопустимый доступ к памяти), обнаруживаемых с помощью ключевого слова C ++ catch, является расширением MSVC для языка C ++.

Вы можете перехватывать такие исключения, даже если они происходят из функции C, если вы используете правильный параметр компилятора, /EHa: http://msdn.microsoft.com/en-us/library/1deeycx5%28v=VS.100%29.aspx

Вы также можете использовать расширение языка обработки структурированных исключений Microsoft (также доступно в C), в котором используются ключевые слова __try и __except: http://msdn.microsoft.com/en-us/library/swezty51.aspx

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