· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Баг MS-компилятора????

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 26, 2003 18:23:19

Тестировался - MS.NET 2002.
Результаты различаются в Debug/Release версиях!

Код:
#include <iostream>

void main(void)
{
     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[i] = c[i+1];
         }
         c[3] = 'x';
     }
     std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;
     return;
}



Дата: Сен 26, 2003 18:29:44

А насколько отличается? Он и должен отличаться. Насколько? Все от натстроек компилятора/линкера зависит.


Дата: Сен 26, 2003 18:48:13 · Поправил: Black_mirror

volodya

Отличаются результаты работы программы? Или генерируемый код?


Дата: Сен 26, 2003 18:54:45

volodya
Это не баг, скорее ОПТИМИАЗТОР %)))
Только что именно отличается?


Дата: Сен 26, 2003 19:31:51

Это точно не баг компилятора. Это баг кода ;) Такое иногда бывает, что работает только Debug версия, попробуй увеличить размер массива с 4 до 5.
Т.е. было:
char c[4];

стало:
char c[5];

хотя мона попробовать и так:
char c[5] = {0};

Иногда помогает.......может быть :)


Дата: Сен 26, 2003 21:56:11 · Поправил: Fixer

masquer

Он и должен отличаться.

Это почему он должен отличаться.

Тут не используется ничего такого что могло бы привести к такому дефекту. Я прогнал на VC++ 6.0 все нормально работает.

Если это гадит оптимизатор можно применить модификатор volatile, но оч-ч-чень мало вероятно. Весьма возможно что это всего лишь кусок программы и тогда корни проблемы надо искать во всей остальной программе.


Дата: Сен 26, 2003 22:01:20 · Поправил: Fixer

Кладу код для пояснения природы глюка
     char sdf[5];
     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[i] = c[i+1];
         }
         c[3] = 'x';
     }
     *(sdf-1) = 'f';
     std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;
     return;


Дата: Сен 27, 2003 01:34:07

Fixer

Если честно, мне этот код мало что поясняет :(
Для чего заводить еще массив?

masquer

Он никогда не должен различаться. Вывод строки на экран должен быть одним и тем же. В теории, мне плевать, что там компилятор наваял! Наплевать и растереть!

To all

Так кто-то может проверить это на своей VS? Я еще на 2003 на выходных проверю.

Edmond
Запусти да посмотри. У тебя же 2002/2003 точно есть :) В дебажной версии скомпили и в релизной. И посмотри. СТРОКА НА ЭКРАН ВЫВОДИТСЯ РАЗНАЯ :((((((
Может и в самом деле volitale... А уж ассемблерные листинги чего только стоят... Похоже и в самом деле оптимизатор перестарался, т.к. ошибки в логике цикла я не вижу, такие циклы часто можно встретить :(((


Дата: Сен 27, 2003 04:06:46

Фишка в том, что оптимизатор (или кто-то еще) оператор
 c[3] = 'x';
считает не влияющим на работу внутреннего цикла и переносит его в начало внешнего. (это видно в отладчике).

решение проблемы для данного случая:
 c[i] = 'x';
т.к. i = 3 после выполнения цикла. А в целом, нужно, наверное, более тщательно продумывать циклы.


Дата: Сен 27, 2003 05:38:42

DaemoniacaL

Баг не мой :) Я тоже придерживался такого же мнения - в первую очередь виноват человек, т.к. оптимизирующие компиляторы чертовски тщательно отлаживаются :)

Fixer
NEOx
DaemoniacaL

Спасибо, ребята :)


Дата: Сен 27, 2003 06:06:10

Глазам своим не верю!!! Значит вижуал суксь, суксь и ещё раз суксь! Как же он вообще компилит серьёзные проекты?! И компилит же... Наверное уже можно открывать раздел по багам в компиляторах.


Дата: Сен 27, 2003 08:47:00

Quantum

Но! Баг не компилятора, а человека. Тот, кто это наваял, это пИсал, а не писАл :)


Дата: Сен 27, 2003 09:11:17 · Поправил: Black_mirror

volodya
Это баг компилятора!
У меня он проявился в программе примерно следующего вида:
while((r=fread(buf,bufsize,1,fin))>0)
{
for(int i=0;i<r;i++)
buf[i-1]+=buf[i];
fwrite(buf,r,1,fout);
}
В реальной программе буфер обрабатывался немного по другому, но переменная цикла изменялась именно так. VС либо операцию записи выносил за пределы цикла, либо выполнял всего одну итерацию внутреннего цикла. А вот BC31 компилировал все нормально.


Дата: Сен 27, 2003 09:39:43

volodya
А может просто отключить оптимизацию, определённого куска кода? Вывести код в отдельную функцию, и поставить прагмы

Например:

#pragma optimize("g", off)
VOID MyFunction(VOID)
{
// Здесь твой код, который находится в main
}
#pragma optimize("g", on)


Дата: Сен 27, 2003 09:54:21

Немного ошибся, вот так:

#pragma optimize("", off)
VOID MyFunction(VOID)
{
// Здесь твой код, который находится в main
}
#pragma optimize("", on)

Это уже точно поможет.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066