Является ли плохо сформированная программа на C или C ++ гарантированно аварийно завершить работу в конфигурации DEBUG в Visual Studio - PullRequest
0 голосов
/ 27 февраля 2019

Во многих случаях, когда я использовал код C и немного C ++ в конфигурации RELEASE в visual studio, у меня были скользкие ошибки, которые не попадали в мое уведомление, и код, хотя и вызывал неопределенное поведение, казалось, работал нормально.Однако после нескольких запусков становится очевидным, что программа содержит ошибки из-за различных необычных результатов и / или сбоев.

Поэтому я решил избавить себя от проблем и быть в безопасности, выбрав конфигурацию DEBUG, покакод все еще находится в стадии разработки.

Но гарантирует ли это, что программа остановится, если код вызывает неопределенное поведение любого вида?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Нет.Программист несет ответственность за работу с плохо определенным поведением.

Сводный список документированных случаев UB только на C составляет 15 страниц.Недокументированные случаи еще более многочисленны, то есть совершают действия, выходящие за рамки того, что даже упоминается в стандарте.И давайте даже не будем упоминать C ++, где список плохо определенного поведения, вероятно, мог бы распространяться как отдельная, толстая публикация.

И тогда каждый отдельный случай UB дико отличается, многие из них появляются только при запускевремя, и результат может быть любым.Компилятор может только так сильно помочь, это не его работа - указывать на потенциальные ошибки во время выполнения.И затем компилятор VS C едва ли следует стандарту.

Отладочные сборки на самом деле могут быть хуже для обнаружения UB, чем релизные сборки.Такие инструменты, как VS, имеют тенденцию обнулять всю память в отладочной сборке - даже локальную память, делая ошибки незаметными.А при отсутствии / низком уровне оптимизации в режиме отладки некоторые ошибки никогда не проявятся.

Чтобы отсеять неопределенное поведение, вы можете использовать внешние инструменты статического / динамического анализа и стандарты кодирования, такие как MISRA или CERT.Но в конце концов это всегда сводится к знанию языка.Обзоры кода, в которых некоторые закаленные ветераны C или C ++ получают право голоса, очень ценны для раннего обнаружения ошибок.

0 голосов
/ 27 февраля 2019

Нет.Невозможно гарантировать сбой кода с неопределенным поведением.

Конечно, выбор конфигурации DEBUG увеличит вероятность того, что некоторые неопределенные поведения будут обнаружены во время выполнения (хотя это может привести кдругие, чтобы не были обнаружены).В частности, если вы не используете необработанные массивы и указатели, а вместо этого используете STL, то версия DEBUG имеет много дополнительных проверок для правильного использования.(Я предполагаю, что вы используете библиотеку Microsoft, потому что gcc / clang не склонны использовать термины DEBUG и RELEASE.)

Также гораздо сложнее (хотя и невозможно) компилировать код с помощью UB или памятиутечки, если вы используете STL.

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