Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Caduceus от Декабрь 29, 2011, 09:47



Название: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Caduceus от Декабрь 29, 2011, 09:47
Вопрос конечно не по поводу QtCreator-а, но все же инстурментарий. Юзаю QtCreator с MSVC компилером. Так вот - программа заходит в ветки условий, которые не выполняются. Причем это не только по шагам в дебаге (можно было бы на ошибку дебагера списать), но и в рантайме - он туда заходит. Например, указатель точно не равен NULL, но он НЕ заходит в if (ptr), или список точно пустой, то он заходит в if (!list.isEmpty())

Что это такое может быть? У меня в хидере одной моей библиотеки стоит pragma (pack 1) - только на это думаю. Может быть из-за этого?


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: popper от Декабрь 29, 2011, 10:15
Посмотри, вылетает ли программа на Q_ASSERT


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Caduceus от Декабрь 29, 2011, 10:20
Так да, вылетает после захождения в ненужные ветки. Например, список пуст, он игнорирует это условие. Заходит в него и так size() списка выдает какой-то мусор - огромное число. Он заходит в цикл по элементам списка и падает выдает Ассерт на первом же обращении к элементу. Почему в size мусор - не понимаю


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: andrew.k от Декабрь 29, 2011, 10:30
Обычно такое происходит в пятницу вечером, а тут четверг утро. Странно)


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: b-s-a от Декабрь 29, 2011, 15:48
Так да, вылетает после захождения в ненужные ветки. Например, список пуст, он игнорирует это условие. Заходит в него и так size() списка выдает какой-то мусор - огромное число. Он заходит в цикл по элементам списка и падает выдает Ассерт на первом же обращении к элементу. Почему в size мусор - не понимаю
типичное поведение программы из-за повреждения памяти. Ищи, возможно, где-то ты пишешь за пределы массива или работаешь с удаленным объектом.


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Igors от Декабрь 29, 2011, 17:17
но и в рантайме - он туда заходит. Например, указатель точно не равен NULL, но он НЕ заходит в if (ptr), или список точно пустой, то он заходит в if (!list.isEmpty())
1) Rebuild All, возможно исходники не соответствуют коду. Ну или глянуть код в asm

2) печатаем напр
Код
C++ (Qt)
if (ptr) {
printf("ptr = %p, inside\n");
..
}
else
printf("ptr = %p, outside\n");
 
Ничего особо фантастичного нет, напр другая нитка может изменить ptr уже после того как if выполнился. Но сначала надо попечатать


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Rem Norton от Январь 03, 2012, 21:34
Был у меня похожий случай. Один сотрудник 2 дня ломал мозг себе и выносил окружающим потому, что:
Код
C++ (Qt)
bool b = true;
...
...
if (!b);
{
// Enter here?!?!?!?!?
}
 

Может следует взглянуть на код повнимательнее? Ну или поискать в проекте строчку типа:
Код
C++ (Qt)
#define false true //Good luck!
 

А вообще не вредно код к вопросу прилагать. Чертовски ускоряет поиск решения.


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: alexman от Январь 03, 2012, 21:49
Код
C++ (Qt)
#define false true //Good luck!
 
Сильно :)


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Rem Norton от Январь 03, 2012, 22:34
Код
C++ (Qt)
#define false true //Good luck!
 
Сильно :)
Ну вообще то это какбе классика, на грани бояна.  ;D


Название: Re: Какая-то фигня - компилер заходит в ветки условий, которые false
Отправлено: Akon от Январь 03, 2012, 22:49
Цитировать
типичное поведение программы из-за повреждения памяти. Ищи, возможно, где-то ты пишешь за пределы массива или работаешь с удаленным объектом.
+1

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