Обсуждение продолжается на comp.lang.c ++. Модерируется вопрос о том, следует ли сохранять в рабочем коде утверждения, которые по умолчанию существуют только в C ++ в отладочных сборках.
Очевидно, что каждый проект уникален, поэтому мой вопрос здесь не столько нужно ли сохранять утверждений , но в каких случаях это рекомендуется / не очень хорошая идея.
Под утверждением я подразумеваю:
- Проверка во время выполнения, которая проверяет условие, которое, если оно ложно, выявляет ошибку в программном обеспечении.
- Механизм, с помощью которого программа останавливается (возможно, после действительно минимальной работы по очистке).
Я не обязательно говорю о C или C ++.
Мое собственное мнение таково: если вы программист, но не владеете данными (как в большинстве коммерческих приложений для настольных компьютеров), вы должны оставить их включенными, потому что ошибочное утверждение показывает ошибку, а вы не должно продолжаться с ошибкой, с риском повреждения данных пользователя. Это заставляет вас тщательно тестировать перед отправкой и делает ошибки более заметными, что облегчает их обнаружение и исправление.
Каково ваше мнение / опыт?
Приветствия
Карл
См. Связанный вопрос здесь
Отзывы и обновления
Привет, Грэм,
Утверждение является ошибкой, чисто и просто и поэтому должно рассматриваться как единое целое.
Так как ошибка должна быть обработана в режиме релиза, вам не нужны утверждения.
Вот почему я предпочитаю слово «ошибка», когда говорю об утверждениях. Это делает вещи намного понятнее. Для меня слово «ошибка» слишком расплывчато. Отсутствующий файл - это ошибка, а не ошибка, и программа должна с ней справиться. Попытка разыменования нулевого указателя является ошибкой, и программа должна признать, что что-то пахнет плохим сыром.
Следовательно, вы должны проверить указатель с утверждением, но наличие файла с нормальным кодом обработки ошибок.
Немного не по теме, но важный момент в обсуждении.
В качестве предупреждения, если ваши утверждения ломаются в отладчике, когда они терпят неудачу, почему бы и нет. Но существует множество причин, по которым файл не может существовать, которые полностью находятся вне контроля вашего кода: права на чтение / запись, переполнение диска, отключение USB-устройства и т. Д. Поскольку вы не можете контролировать его, я считаю, что утверждения не правильный способ справиться с этим.
Карл
Thomas
Да, у меня есть код завершения и должен сказать, что я категорически не согласен с этим конкретным советом.
Скажите, что ваш пользовательский распределитель памяти испортил и обнулел кусок памяти, который все еще используется другим объектом. Я получаю нулевой указатель, который регулярно разыменовывается в этом объекте, и один из инвариантов в том, что этот указатель никогда не равен нулю, и у вас есть пара утверждений, чтобы убедиться, что он остается таким. Что вы делаете, если указатель внезапно становится нулевым. Вы просто если () вокруг него, надеясь, что это работает?
Помните, мы говорим о коде продукта здесь, так что нет никакого взлома отладчика и проверки локального состояния. Это настоящая ошибка на компьютере пользователя.
Карл