Найдено результатов: 1

Когда утверждения должны оставаться в производственном коде?

В comp.lang.c++.moderated идет дискуссия о том, следует ли сохранять утверждения, которые в C++ существуют только в отладочных сборках по умолчанию, в производственном коде или нет.

Очевидно, что каждый проект уникален, поэтому мой вопрос здесь заключается не столько в том, следует ли сохранять утверждения, но в каких случаях это рекомендуется/не очень хорошая идея.

Под утверждением я подразумеваю:

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

Я не обязательно говорю о C или C++.

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

Что ваш opinion/experience?

Овации,

Карл

Смотрите соответствующий вопрос здесь


Ответы и обновления

Привет Грэм,

Утверждение-это ошибка, чистая и простая, и поэтому его следует рассматривать как таковое. Поскольку ошибка должна обрабатываться в режиме выпуска, то вам действительно не нужны утверждения.

Вот почему я предпочитаю слово "bug", когда говорю об утверждениях. Это делает вещи намного яснее. Для меня слово "error" слишком расплывчато. Отсутствующий файл-это ошибка, а не ошибка, и программа должна с ней разобраться. Попытка разыменовать указатель null-это ошибка, и программа должна признать, что что-то пахнет плохим сыром.

Следовательно, вы должны проверить указатель с утверждением, но наличие файла с обычным кодом обработки ошибок.


Небольшое отклонение от темы, но важный момент в обсуждении.

В качестве предупреждения, если ваши утверждения прорываются в отладчик, когда они терпят неудачу, почему бы и нет. Но существует множество причин, по которым файл не может существовать, которые полностью находятся вне контроля вашего кода: права на чтение/запись, диск заполнен, устройство USB отключено и т. д. Поскольку вы не можете контролировать это, я чувствую, что утверждения-это не правильный способ справиться с этим.

Карл


Томас,

Да, у меня есть полный код, и должен сказать, что я решительно не согласен с этим конкретным советом.

Допустим, ваш пользовательский распределитель памяти ошибается и обнуляет часть памяти, которая все еще используется каким-то другим объектом. Мне случается обнулить указатель, который этот объект разыменовывает регулярно, и один из инвариантов заключается в том, что этот указатель никогда не является null, и у вас есть пара утверждений, чтобы убедиться, что он остается таким же. Что делать, если указатель вдруг окажется null? Вы просто стоите вокруг него, надеясь, что он работает?

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

Карл

assert    

380   16   11:45, 2nd August, 2020