Только сегодня я наткнулся на версию этой ошибки. Я предлагаю свой опыт здесь на случай, если он станет полезным для всех.
У меня был какой-то код, который сводился к
if(!(a == b && c.d())) { do_something(); }
Ошибка, которую я преследовал, заключалась в том, что do_something()
происходило неправильно. И все же a
определенно равнялось b
, а c.d()
, казалось, возвращало истину.
Поскольку я отслеживал это, я временно добавил эти тестовые распечатки:
if( a == b && c.d() ) printf("yes\n"; else printf("no\n");
if(!(a == b && c.d())) printf("noo\n"; else printf("yess\n");
К моему удивлению, это напечатанные yes
и noo
, которые подтверждали и то, почему do_something
происходило, и что происходило что-то очень странное.
Оказалось, что метод d()
был чем-то вроде
bool whatever::d() {
return _successful;
}
Но _successful
был неинициализирован. Когда я распечатал его значение, оно было 236, поэтому ранее я говорил, что «c.d()
, похоже, возвращает истину».
Я не проверял ассемблерный код, но я предполагаю, что в некоторых обстоятельствах gcc проверял, был ли он ненулевым или нет, но в других случаях он просто проверял младший бит.
При правильной инициализации _successful
ошибка исчезла. (Он был неинициализирован в течение десять лет , так как более ранний программист впервые написал метод d()
. Однако ошибка не проявлялась всего несколько месяцев назад. Вот почему иногда Software Is Hard.)