2009-07-18 1 views
2

Это может случиться? 3 утверждает, где нужно активировать.C/C++ значение int, которое не является числом?

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

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

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

Любые идеи?

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

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

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

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

+1

Какова была цель написать эти 3 утверждения изначально? –

+0

Проще говоря, для генерации ошибки в случае, если код действительно выполняет указанные выше строки, в противном случае он завершится возвратом 0 – Milan

+4

Положите точку останова на строку и проверите значение nr. –

ответ

13

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

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

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

#define assert 

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

#define < == 
#define > == 

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

+0

Ну да, неопределенное поведение может объяснить что угодно. – 2009-07-18 21:59:02

+0

Поскольку код в perform_calc() тяжелый с использованием буферов ... угадайте, есть ответ.Спасибо – Milan

+0

Ahaha python комментирует, а не директивы препроцессора C ... –

14

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

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

+0

Хорошее мышление. : D – GManNickG

+0

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

+0

Ну, он говорит в вопросе, что его происходит на определенном значении (подразумевая, что по другим значениям действуют утверждения). – Frank

-3

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

assert(nr == nr); 
+0

Вряд ли для целого числа. –

+5

ints не может быть NaN. NaN - число с плавающей запятой. Ну, на самом деле NaN не является числом с плавающей точкой. –

+3

Целые числа не делают NaN на любой платформе, о которой я знаю. –

4

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

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

+1

Возможно, его реализация не имеет экрана или какого-либо вывода –

+3

Тогда как он узнает, что утверждения не подвели? И я единственный человек, о котором я слышал о Бритве Оккама? – 2009-07-18 22:27:14

+3

Бритва Оккама: выбор атеиста для нужд бритья;) –

1

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

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

5

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

assert(nr == 0); 

выше линии будет вызывать выход(), если пг = 0. Таким образом, если проходит эта линия, вторая утверждают будет! выполнить:

assert(nr > 0); 

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

assert(nr < 0); 

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

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

5

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

Смежные вопросы