Условие оценивается как истинное, а отладчик говорит, что оно должно быть ложным - PullRequest
1 голос
/ 25 февраля 2011

Я отлаживал в gdb, когда натолкнулся на эту странность: тип

(gdb) 
107                     newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE;
(gdb) 
107                     newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE;
(gdb) print infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE
$11 = FALSE
(gdb) s
108                     if (newIterationRequired)
(gdb) print newIterationRequired
$13 = TRUE

newIterationRequired - это перечисление, которое имитирует логическое поведение в C ++:

typedef enum { FALSE, TRUE } bool;

Howэто возможно?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

GDB неправильно оценивает sqrt, как показано там: Почему GDB оценивает sqrt (3) в 0?

2 голосов
/ 25 февраля 2011

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

newIterationRequired = ( ( infoAvailableUntil + 1 ) < ( sqrt( input ) + 1 ) ) && isPrime

Да, и подсказка: Проверьте <stdbool.h> ...

Редактировать 1: Ваш комментарий говорит, что это не решило вашу проблему.

Ну, тогда выделите сложное утверждение в его подстанции.Сохраните infoAvailableUntil + 1 во временную переменную.Сохраните sqrt( input ) + 1 в другой временной переменной.Составь newIterationRequired из этих временников.Внутри GDB проверьте, согласны ли код, вы и GDB с результатами каждого промежуточного шага.

Это элементарная отладка .Выделите утверждение, которое доставляет вам проблемы, уменьшает его сложность до тех пор, пока вы не найдете ошибку или не сможете задать очень точный вопрос.

(Лично мой следующий «лучший подозреваемый» - это то, что ваш код и gdb видятдругое дело, когда вы говорите sqrt().)

1 голос
/ 25 февраля 2011

Если вы не скомпилируете с -O0, вы не можете быть уверены, что один шаг выполняет одну строку исходного кода за другой. Вполне возможно, что в тот момент, когда вы запрашивали оценку выражения, все аргументы не были завершены, поэтому результат ненадежен.

Другое объяснение состоит в том, что некоторый аргумент выражения больше не существует в живых регистрах, поэтому GDB одурачен и делает неправильные вычисления.

...