C / C ++ значение int, которое не является числом?
Вопрос
Может ли это когда - нибудь случиться ?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 );