Действует ли assert () как функция идентификации в режиме выпуска? - PullRequest
0 голосов
/ 31 августа 2018

Эта библиотека использует assert(), как будто это функция идентификации в режиме выпуска (когда определено NDEBUG). Проблема в том, что какой-то важный код обернут в assert(), и мои тесты сработали при выполнении в режиме выпуска, потому что эти важные части не были вызваны. Пример этого можно найти здесь , где генератор случайных байтов ничего не сгенерирует и вызовет бесконечный цикл.

Личный анекдот: мне не нравится assert(), и я лично не пользуюсь им из-за этих проблем двусмысленности. Я слышал о многих проектах, которые имели серьезные ошибки из-за этого, совсем недавно EOS, когда их модульные тесты не обнаружили некоторые массивы вне диапазона, потому что NDEBUG был определен в режиме выпуска, и он не срабатывал. Документация, кажется, не ясна по этому вопросу. assert() действует как личность вообще?

Эта библиотека (libbtc), кажется, широко используется, и я не понимаю, почему разработчик сделал это. Это ужасная ошибка, и я должен раскошелиться и удалить все эти утверждения? Или это какая-то вещь C, которая не совместима с C ++? Может кто-нибудь объяснить, пожалуйста, правильный курс действий здесь?

Я использую Clang 6.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Похоже, автор библиотеки неправильно использовал assert и поместил функциональный код там, где он не принадлежал. Что касается ошибок из-за assert (), это происходит из-за неправильного понимания его цели или отсутствия дисциплины программирования. assert () используется для проверки того, что инварианты не нарушаются, не для функционального кода. assert () очень легко использовать не по назначению или использовать не в том месте.

0 голосов
/ 31 августа 2018

С https://en.cppreference.com/w/cpp/error/assert:

Если NDEBUG определено как имя макроса в точке в исходном коде, где включено <cassert>, то assert ничего не делает.

Не помещайте в assert ничего, что имеет побочные эффекты, от которых вы зависите. Они не произойдут, когда вы скомпилируете релиз, и изменят поведение вашей программы.

...