Ход исполнения простого кода не соответствует ожидаемому
От: kfmn Россия  
Дата: 02.10.15 09:58
Оценка:
Добрый день, коллеги!

Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!

Есть код
std::vector<SSegmHeader> hdr_arr(hdr_list.begin(), hdr_list.end());
std::vector<SSegmHeader> hdr_arr_phone;
for (size_t i=0; i<hdr_arr.size(); i++)
{
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);
}


Перед циклом вектор hdr_arr имеет 80 элементов, после цикла новый вектор hdr_arr_phone имеет 28 элементов. Тут все ОК. Мистика начинается дальше.

Если убрать операторные скобки от for'а, т.е. сделать его таким:
for (size_t i=0; i<hdr_arr.size(); i++)
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);

то цикл (под дебаггером) выполняется только 1 раз, для нулевого элемента вектора условие выполняется, делается push_back и на этом все заканчивается, hdr_arr_phone имеет только 1 скопированный элемент.

Если же добавить к if'у пустой else:
for (size_t i=0; i<hdr_arr.size(); i++)
    if (hdr_arr[i].state==0)
        hdr_arr_phone.push_back(hdr_arr[i]);
    else
    {
    }

то опять все работает, как должно.

Ести еще одна странность: переменная i в этом коде объявляется первый раз по телу функции. Дальше есть другие аналогичные объявления i, но это первое. И все последующие объявления именно такие — в теле цикла.
Тем не менее в неправильно работающем (среднем) варианте после выхода из цикла дебаггер показывает значение i=0 (а не пишет, что она out-of-scope или не определена). Это, конечно, может быть причудой дебаггера, но сам ход исполнения меня приводит в полное недоумение.

Что я делаю не так?
Re: Ход исполнения простого кода не соответствует ожидаемому
От: Кодт Россия  
Дата: 02.10.15 10:19
Оценка: +5
Здравствуйте, kfmn, Вы писали:

K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!


Это запросто может быть причудой дебаггера, если в твоей сборке включена оптимизация. Проверь флаги компилятора и убедись, что там /Od, и что вообще сборка дебажная, и что отладочная информация актуальная.
Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!

Если под дебажной сборкой будет глючить — попробуй распечатать результат препроцессора. Может, действительно макросы.
(Project — properties — C++ — preprocessor — preprocess to file)
Перекуём баги на фичи!
Re: Ход исполнения простого кода не соответствует ожидаемому
От: VladFein США  
Дата: 02.10.15 13:08
Оценка: +2
Здравствуйте, kfmn, Вы писали:

K>Что я делаю не так?


Мистика, скорее всего (как обычно), осталась за кадром.
Приведите, пожалуйста, полный работающий пример этого дефекта.
Re[2]: Ход исполнения простого кода не соответствует ожидаемому
От: Кодт Россия  
Дата: 02.10.15 14:47
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!


Кстааати! А что, если там идиома из VC6 — борьба против вылезания переменной цикла из области видимости:
#define for  if(false) {} else for

только криво сделанная?

(Мне всё равно трудно сообразить, как же её нужно так криво написать, чтобы она была чувствительна к {} и else — но чем чёрт не шутит?)

И заодно, посмотреть, нет ли флажка /Zc:forScope- или прагмы #pragma conform(forScope,...)
https://msdn.microsoft.com/en-us/library/84wcsx8x.aspx

И то, и другое добро может приехать из легаси.
Перекуём баги на фичи!
Re[2]: Ход исполнения простого кода не соответствует ожидаемому
От: kfmn Россия  
Дата: 02.10.15 14:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, kfmn, Вы писали:


K>>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!


К>Это запросто может быть причудой дебаггера, если в твоей сборке включена оптимизация. Проверь флаги компилятора и убедись, что там /Od, и что вообще сборка дебажная, и что отладочная информация актуальная.

К>Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!

К>Если под дебажной сборкой будет глючить — попробуй распечатать результат препроцессора. Может, действительно макросы.

К>(Project — properties — C++ — preprocessor — preprocess to file)

Оптимизация выключена. Сборка полностью дебажная.
Да и проект относительно несложный, я там специально никаких изменений по сравнению с дефолтовыми настройками не делал...
С препроцессором попробую, но что-то верится с трудом
Re[3]: Ход исполнения простого кода не соответствует ожидаемому
От: Evgeny.Panasyuk Россия  
Дата: 02.10.15 14:56
Оценка:
Здравствуйте, kfmn, Вы писали:

K>Оптимизация выключена. Сборка полностью дебажная.

K>Да и проект относительно несложный, я там специально никаких изменений по сравнению с дефолтовыми настройками не делал...
K>С препроцессором попробую, но что-то верится с трудом

Добавь элементарную отладочную печать.
Re: Ход исполнения простого кода не соответствует ожидаемому
От: CEMb  
Дата: 02.10.15 15:17
Оценка: +1
Здравствуйте, kfmn, Вы писали:

K>Что я делаю не так?


Посмотри по шагам скомпилированный ассебмлерный код под отладчиком? Я в непонятных ситуациях всегда так делаю, вся мистика разрешается очень быстро, а заодно можно изучить, как всякие конструкции языка, невидимо для глаз реализованные на нижнем уровне

Тоже интересно, что там у тебя происходит
Re[2]: Ход исполнения простого кода не соответствует ожидаемому
От: T4r4sB Россия  
Дата: 02.10.15 15:19
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Посмотри по шагам скомпилированный ассебмлерный код под отладчиком?


Причём код не программы, а компилятора. Реально иногда блин хочется так сделать.
Re[3]: Ход исполнения простого кода не соответствует ожидаемому
От: CEMb  
Дата: 02.10.15 17:43
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Причём код не программы, а компилятора. Реально иногда блин хочется так сделать.


Тогда уж и компилятор с исходниками, чтобы когда чего нету, можно было дописать нехватающее самому
Re: Ход исполнения простого кода не соответствует ожидаемому
От: AlexGin Беларусь  
Дата: 03.10.15 12:49
Оценка: :)
Здравствуйте, kfmn, Вы писали:

K>Добрый день, коллеги!


K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!

Эта ситуация повторяется так же на других версиях Visual Studio: например MSVS 2013?

P.S. А может просто установленная на Вашей машине MSVS нуждается в переустановке?
Отредактировано 03.10.2015 12:51 AlexGin . Предыдущая версия .
Re: Ход исполнения простого кода не соответствует ожидаемому
От: Vain Россия google.ru
Дата: 04.10.15 11:39
Оценка: +1
Здравствуйте, kfmn, Вы писали:

K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!

это очень старая бага, я её ещё вроде в 2005 ловил.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Ход исполнения простого кода не соответствует ожидаемому
От: Ops Россия  
Дата: 05.10.15 18:40
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Добавь элементарную отладочную печать.


А лучше барьер. Похоже на оптимизацию цикла.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Ход исполнения простого кода не соответствует ожидаемому
От: Ops Россия  
Дата: 05.10.15 18:45
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Тогда уж и компилятор с исходниками, чтобы когда чего нету, можно было дописать нехватающее самому


Ну согласись, иногда результат препроцессора или даже ассемблер интересен. В этом и есть фича С и плюсов, когда понимаешь, что получится.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Ход исполнения простого кода не соответствует ожидаемому
От: Evgeny.Panasyuk Россия  
Дата: 05.10.15 18:45
Оценка:
Здравствуйте, Ops, Вы писали:

EP>>Добавь элементарную отладочную печать.

Ops>А лучше барьер. Похоже на оптимизацию цикла.

Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому.
Барьер же может изменить ход под отладкой.
Re[6]: Ход исполнения простого кода не соответствует ожидаемому
От: Ops Россия  
Дата: 05.10.15 18:47
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому.

EP>Барьер же может изменить ход под отладкой.

Барьер работает на компилятор.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: Ход исполнения простого кода не соответствует ожидаем
От: Evgeny.Panasyuk Россия  
Дата: 05.10.15 18:50
Оценка:
Здравствуйте, Ops, Вы писали:

EP>>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому.

EP>>Барьер же может изменить ход под отладкой.
Ops>Барьер работает на компилятор.

Да, и в результате чего может изменить ход визуализации выполнения под отладчиком.
Отредактировано 05.10.2015 18:50 Evgeny.Panasyuk . Предыдущая версия .
Re[8]: Ход исполнения простого кода не соответствует ожидаем
От: Ops Россия  
Дата: 05.10.15 18:56
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Да, и в результате чего может изменить ход визуализации выполнения под отладчиком.


Ну я рядом писал, что стоит посмотреть результирующий код. Однако первое подозрение на оптимизацию цикла.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[9]: Ход исполнения простого кода не соответствует ожидаем
От: Evgeny.Panasyuk Россия  
Дата: 05.10.15 19:04
Оценка: +1
Здравствуйте, Ops, Вы писали:

EP>>Да, и в результате чего может изменить ход визуализации выполнения под отладчиком.

Ops>Ну я рядом писал, что стоит посмотреть результирующий код. Однако первое подозрение на оптимизацию цикла.

Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход.
Или у ТС и результат неправильный(а не только ход)?
Re[10]: Ход исполнения простого кода не соответствует ожидаем
От: Ops Россия  
Дата: 05.10.15 19:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход.

EP>Или у ТС и результат неправильный(а не только ход)?

ТС вряд ли смотрел, что получилось.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[11]: Ход исполнения простого кода не соответствует ожидаем
От: Evgeny.Panasyuk Россия  
Дата: 05.10.15 19:23
Оценка:
Здравствуйте, Ops, Вы писали:

EP>>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход.

EP>>Или у ТС и результат неправильный(а не только ход)?
Ops>ТС вряд ли смотрел, что получилось.

Об этом и речь. Здесь задача показать ему, что результат эквивалентен коду, несмотря на "странный" ход под отладчиком.
Добавление же барьера может привести к обычному ходу под отладчиком, что не интересно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.