Вопрос

Может ли это когда - нибудь случиться ?3 утверждает, где следует активировать.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

Может ли быть случай, когда программа не активирует утверждения на g ++ 3.4.4.

И нет, у меня нет возможности изменить код, чтобы распечатать номер в случае, если утверждения не активируются.

Есть какие-нибудь идеи?

Редактировать:Прочитав несколько комментариев, я был вынужден отредактировать.Показать код?зачем ты делаешь эту глупость ?Я в это не верю !Где это используется ?Из моего вопроса должно было быть очевидно, что я не буду публиковать / изменять код по нескольким возможным причинам:

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

Если вы верили, что я разыгрываю розыгрыш или мистификацию, вам следовало вместо этого проголосовать за закрытие темы.Меня бы это совершенно устроило.Но добавление ненужных комментариев, подобных этому, только заставило меня захотеть, чтобы флаг "отношение" был реализован.

Я хочу поблагодарить других за их комментарии и ответы, которые действительно пытались объяснить и ответили на мой вопрос.

Это было полезно?

Решение

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

Хотя это очень отдаленная возможность, так что это то, что вы показываете.

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

#define assert 

или какой-нибудь коллега поместил что-то подобное в заголовок, пока вы были в туалете

#define < ==
#define > ==

Как предложено в другом ответе, проверьте с помощью gcc -E, чтобы увидеть, какой код на самом деле скомпилирован.

Другие советы

assert снят флажок, если макрос NDEBUG определяется.Убедитесь, что вы #undef NDEBUG при компиляции этой единицы перевода.

Вы можете вызвать gcc с помощью -E переключитесь, чтобы убедиться, что ваши инструкции assert все еще находятся в коде.

Во-первых, не похоже, что этот код является правильным.Если отладка включена (DEBUG и /или _DEBUG установлены, а NDEBUG не установлен):

assert( nr == 0);

Приведенная выше строка вызовет exit(), если nr != 0.Следовательно, если эта строка пройдет, будет выполнено второе утверждение:

assert( nr > 0);

...И вызовите exit(), потому что nr == 0 и !(nr > 0).

assert( nr < 0);

И эта третья строка вообще никогда не будет запущена.

В чем именно заключается смысл этого кода?И почему, если эти утверждения можно было бы добавить, не могли бы вы вместо этого добавить printf()?

Является ли этот код многопоточным?Может быть, у вас есть условия гонки.

И нет, у меня нет возможности изменить код, чтобы распечатать выведенное число..

Странно.Очевидно, что у вас есть возможность вставлять инструкции assert (), потому что, если бы они были на самом деле в реальном коде, который вы не могли бы потрогать, код не смог бы работать.Итак, почему вы не можете напечатать значение, которое assert() вызывает test?

Я подозреваю, что вы случайно устранили проблему при очистке фрагмента кода.Там либо больше кода (и nr меняется между утверждениями), либо на самом деле это так не выглядит (или, согласно rlbond, у вас не включено утверждение).

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

Может ли это быть NaN?В этом случае следующее утверждение завершилось бы неудачей:

assert( nr == nr );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top