Войти
ПрограммированиеФорумГрафика

релиз и дебуг выдают разные результаты

Страницы: 1 2 Следующая »
#0
16:20, 22 ноя. 2004

релиз и дебуг выдают разные результаты в VC7.1

#include <iostream>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char c[4];
    c[0]='a';
    c[1]='b';
    c[2]='c';
    c[3]='d';

    std::cout << "before: " << c[0] << c[1] << c[2] << c[3] << std::endl;

    for (int n=2 ; n>0; --n)
    {
        for (int i=0; i<3; i++)
        {
            c = c[i+1];
        }
        c[3] = 'x';
    }

    std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;
    return 0;
}


#1
16:58, 22 ноя. 2004

bobbob
И какие же они результаты выдают ? :)

#2
17:00, 22 ноя. 2004

разные! :)))
Ориентируйся на релиз :))))

#3
17:05, 22 ноя. 2004


походу:

    for (int n=2 ; n>0; --n)

  в дебуге делает 2 цикла
  в релизе делает 3 цикла

    for (int n=2 ; n>0; n--) // вроде аналогично работает

#4
17:10, 22 ноя. 2004

bobbob
Как определил, сколько циклов делает дебаг и релиз?

#5
17:12, 22 ноя. 2004

bobbob

это бага VC7.1, на rsdn была обсужена давным давно

#6
17:14, 22 ноя. 2004

ыыыыыыыыыы
Ой, блин... Ой-ой-ой...

Да. Причем что самое страшное - правильный результат - в дебаге. Ай-ай-ай!!!!

Ужас какой-то. Кто-нить уже слазил на М$ в поисках солюшена?

#7
17:16, 22 ноя. 2004

Если отключить оптимизацию - то в релизе правильный результат

#8
17:58, 22 ноя. 2004

Fj

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

Решить можно так:
volatilechar c[4];
Может, можно еще как-то поиграться, что бы подрезать крылья оптимизатору.

#9
18:04, 22 ноя. 2004

Мда, хреново.

Если быть точным, то баг появляется установке опции Optimization=Maximize Speed или Full Optimization.

Компилер генерит такой код:

; 14   :
; 15   :     for (int n=2 ; n>0; --n)
  00067	48		 dec	 eax
; 16   :     {
; 17   :         for (int i=0; i<3; i++)
; 18   :         {
; 19   :             c[i] = c[i+1];
  00068	88 5c 24 0c	 mov	 BYTE PTR _c$[esp+20], bl
  0006c	8a 5c 24 0e	 mov	 bl, BYTE PTR _c$[esp+22]
  00070	88 4c 24 0e	 mov	BYTE PTR _c$[esp+22], cl
  00074	75 f1		     jne      SHORT $L8482
; 20   :         }
; 21   :         c[3] = 'x';
; 22   :     }
; 23   :
-- который является некорректным.

Было бы хорошо на VS2005 потестить... я её ещё не качал.

#10
18:05, 22 ноя. 2004

_Winnie, у тебя вроде была VS2005?

#11
18:42, 22 ноя. 2004

cppguru

/Od /O2, /Ox -  cdxx

#12
18:45, 22 ноя. 2004

cppguru
Насколько я помню, если взять не кокретные значения abcd, а неизвестные, скажем из cin, то бага останется. Можно конкретно мотреть, что он там напутал. Я не помню точно, он кажется что-то вроде add esp,* переставил с чем-то, с чем переставлять никак нельзя. Сейчас под рукой vc71 нет, только vc6 и vc8 =)

#13
19:16, 22 ноя. 2004

_Winnie
у тебя vc8 бета? или уже рабочая версия?

#14
19:47, 22 ноя. 2004

bobbob
бета + Tools Refresh.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.