Russian Qt Forum
Октябрь 01, 2024, 10:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Какая-то фигня - компилер заходит в ветки условий, которые false  (Прочитано 4405 раз)
Caduceus
Гость
« : Декабрь 29, 2011, 09:47 »

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

Что это такое может быть? У меня в хидере одной моей библиотеки стоит pragma (pack 1) - только на это думаю. Может быть из-за этого?
Записан
popper
Гость
« Ответ #1 : Декабрь 29, 2011, 10:15 »

Посмотри, вылетает ли программа на Q_ASSERT
Записан
Caduceus
Гость
« Ответ #2 : Декабрь 29, 2011, 10:20 »

Так да, вылетает после захождения в ненужные ветки. Например, список пуст, он игнорирует это условие. Заходит в него и так size() списка выдает какой-то мусор - огромное число. Он заходит в цикл по элементам списка и падает выдает Ассерт на первом же обращении к элементу. Почему в size мусор - не понимаю
Записан
andrew.k
Гость
« Ответ #3 : Декабрь 29, 2011, 10:30 »

Обычно такое происходит в пятницу вечером, а тут четверг утро. Странно)
Записан
b-s-a
Гость
« Ответ #4 : Декабрь 29, 2011, 15:48 »

Так да, вылетает после захождения в ненужные ветки. Например, список пуст, он игнорирует это условие. Заходит в него и так size() списка выдает какой-то мусор - огромное число. Он заходит в цикл по элементам списка и падает выдает Ассерт на первом же обращении к элементу. Почему в size мусор - не понимаю
типичное поведение программы из-за повреждения памяти. Ищи, возможно, где-то ты пишешь за пределы массива или работаешь с удаленным объектом.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 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 выполнился. Но сначала надо попечатать
Записан
Rem Norton
Гость
« Ответ #6 : Январь 03, 2012, 21:34 »

Был у меня похожий случай. Один сотрудник 2 дня ломал мозг себе и выносил окружающим потому, что:
Код
C++ (Qt)
bool b = true;
...
...
if (!b);
{
// Enter here?!?!?!?!?
}
 

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

А вообще не вредно код к вопросу прилагать. Чертовски ускоряет поиск решения.
Записан
alexman
Гость
« Ответ #7 : Январь 03, 2012, 21:49 »

Код
C++ (Qt)
#define false true //Good luck!
 
Сильно Улыбающийся
Записан
Rem Norton
Гость
« Ответ #8 : Январь 03, 2012, 22:34 »

Код
C++ (Qt)
#define false true //Good luck!
 
Сильно Улыбающийся
Ну вообще то это какбе классика, на грани бояна.  Смеющийся
Записан
Akon
Гость
« Ответ #9 : Январь 03, 2012, 22:49 »

Цитировать
типичное поведение программы из-за повреждения памяти. Ищи, возможно, где-то ты пишешь за пределы массива или работаешь с удаленным объектом.
+1

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


Страница сгенерирована за 0.351 секунд. Запросов: 23.