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

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

<< . 1 . 2 .

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


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

Запусти да посмотри. У тебя же 2002/2003 точно есть :)

Но не на работе, Здесь только VS 6 + Fortran + Masm32 + PHP + Perl %)))

Да и хватит вам пепел сыпать на С++
это нормальное явление. В каждом языке есть подобный БАГ. Что поделать, за высокою сложность ОПТИМИЗАТОРА нужно как-то платить. Поймите это :)
Лучше напишите письмо разработчикам :)


Дата: Сен 27, 2003 21:04:43

Вот, ещё один баг, который проявляется даже без оптимизации:
simpleStack P; // <- абстрактный стек для int
P.push(5);
P.push(4);
P.push(3);     // теперь в стеке "хвост"<-5<-4<-3
printf("P: %d %d %d", P.pop(), P.pop(), P.pop());

А теперь так:
simpleStack P; // <- абстрактный стек для int
P.push(5);
P.push(4);
P.push(3);     // теперь в стеке "хвост"<-5<-4<-3
printf("P: %d ", P.pop());
printf("%d ", P.pop());
printf("%d", P.pop());

В первом случае получается дамп стека наоборот, что вполне объяснимо для ассемблерщика, но как это объяснить студентам, пишущим на С и асма не ведающим? Ведь с точки зрения С первый вариант тоже верен.


Дата: Сен 28, 2003 17:12:39

Я, например, не считаю это багом... скорее недосмотр программиста.
Это обычный 'side effect' - каких много.
Пример:
#define MINIMUM(var,n1,n2)  \
  if (n1 < n2) var = n1;    \
  else var = n2;

int i1=45;
int i2=47;
int minVar;

MINIMUM (minVar, i1++, i2++)


Дата: Сен 28, 2003 19:23:20

AsmGuru62
А в чём же баг? У меня правильно выдаёт: 46.


Дата: Сен 29, 2003 17:51:24 · Поправил: AsmGuru62

Я к тому, что параметры макро используются несколько раз и пост-инкремент тоже должен повториться столько же раз. Таким образом, оригинальные значения параметров i1,i1 будут не такими, как ожидается.

P.S. Я послал это в Microsoft.


Дата: Сен 29, 2003 18:46:26 · Поправил: Quantum

AsmGuru62
параметры макро используются несколько раз и пост-инкремент тоже должен повториться столько же раз
Ясно. Вспомнил такой казус...
В C следующий код возвращает значение "6":
int i = 5;
i = i++;
return i;
Зато в Java он возвращает "5"! Это был супер-баг когда я переводил С-код на Java.


Дата: Сен 29, 2003 20:41:23 · Поправил: rst

Это блин мелочи... в МС компилерах есть гораздо больше недочетов и багов а так же Not Implemented, которые действительно мешают жить... И совсем не связанные со сложностью реализации оптимайзера.
Вспомним хотя бы отсутсвие спецификации исключений. И у меня где-то были прикольные примеры с шаблонами, где Cl валился со словами - "мне что-то стало плохо, правда почему мне плохо - х.з." . Самый маленький занимал 3 строчки.. -))


Дата: Сен 30, 2003 06:53:20

rst
Это блин мелочи...
Разве?! Из-за подобных мелочей проекты не компилятся!

Самый маленький занимал 3 строчки
Так поделись этими примерами. Думаю, многим будет интересно.


Дата: Сен 30, 2003 11:39:08

Quantum

В C следующий код возвращает значение "6"

Если бы он возвращало что нибудь другое это было бы багом, на самом деле эта ситуация соответствует спецификации ANSI C к примеру
Записано                На самом деле

i = i++ * 3             i = i*3
                        i++

i = i++                 i = i
                        i++


Дата: Сен 30, 2003 12:37:55

По поводу моего предидущего поста:

Посмотрел ANSI C к сожалению там по этому поводу говориться очень мутно. Так что лучше избегать таких конструкций, а то будете получать компиляторно-зависимый код.


Дата: Сен 30, 2003 13:52:29

Посмотрел ANSI C к сожалению там по этому поводу говориться очень мутно. Так что лучше избегать таких конструкций, а то будете получать компиляторно-зависимый код.

Да нет, как раз в стандарте этот момент хорошо описывается. Есть операция i++, а есть операция ++i. Эффект, понятное дело несколько отличается.

P.S. Прежде чем ругать VS 6.0 навесьте на него хотя бы последний сервис пак. :-)
P.P.S. VS 2002 ругать можно. :-))


Дата: Сен 30, 2003 15:44:42

>Разве?! Из-за подобных мелочей проекты не компилятся!
Да , это сложный баг в принципе и его сложно найти, НО это мелочь. Есть более досадные вещи в С++. Пример - вызвать как callback функцию, функцию, являющуюся нестатическим членом класса, с привязкой к конкретному экземпляру. В С++ этого почти нет. Можно через mem_fun нужно посмотреть свой старый код. А можно как это в WTL реализовано. Мне приходилось писать thiscall_adapter который делал push this;jmp fun. Вот это действительно начинает превращаться в проблему - когда язык в принципе не предназначен для такого, и средств для реализации - не особо есть. И тогда стоишь перед trade-off - либо писать с геморром, но на "языке программирования" либо превращать его в свою реализацию вот такими ассемблерными вставками-хелперами.
А по поводу примера как заставить в 3 строчки упасть компилер от MSVC - сейчас нет доступа к помойке с моими старыми проектами - как доберусь - сразу запощу.

<< . 1 . 2 .


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