assert, -NDEBUG и ошибка сегментации

У меня есть довольно большой фрагмент кода, который хорошо работает в разрабатываемой версии со многими assert() в коде. Я отключил утверждения с помощью директивы -DNDEBUG, переданной в g++, и теперь мой код ломается из-за seg. вина. Есть ли что-то, чего я не знаю об assert()?


person Jakub M.    schedule 27.06.2011    source источник


Ответы (1)


Насколько мне известно, наиболее распространенной проблемой с assert является наличие кода с побочными эффектами внутри самого assert. При компиляции с параметром -DNDEBUG утверждения по существу закомментированы, поэтому код внутри утверждения не выполняется. Страница руководства assert упоминает об этом в разделе ошибок:

BUGS
       assert()  is implemented as a macro; if the expression tested has side-
       effects, program behavior will be different depending on whether NDEBUG
       is defined.  This may create Heisenbugs which go away when debugging is
       turned on.
person wollw    schedule 27.06.2011
comment
Чтобы решить эту проблему, используйте VERIFY, а не ASSERT для кода с побочными эффектами, например. см. здесь. - person Kerrek SB; 27.06.2011