C / C ++ int значение, которое не число? - PullRequest
2 голосов
/ 19 июля 2009

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

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

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

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

Есть идеи?

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

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

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

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

Ответы [ 7 ]

14 голосов
/ 19 июля 2009

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

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

13 голосов
/ 19 июля 2009

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

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

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

#define assert 

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

#define < ==
#define > ==

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

5 голосов
/ 19 июля 2009

Этот код многопоточный? Возможно, у вас состояние гонки .

5 голосов
/ 19 июля 2009

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

assert( nr == 0);

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

assert( nr > 0);

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

assert( nr < 0);

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

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

4 голосов
/ 19 июля 2009

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

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

1 голос
/ 19 июля 2009

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

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

0 голосов
/ 19 июля 2009

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

assert( nr == nr );
...