Георгий |
Отправлено: 21.06.2003, 18:11 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
взято с IXBT.com (http://forum.ixbt.com/0026/023284.html):
CODE |
недавно сталкнулись с ошибкой суть которой поясняет следующий пример:
char m[100];
void f(int a, int B)
{
m[b] = 1;
m[a+a+a] = 0;
}
....
f(1, 2);
посмотрим что сгенерировал компилер в функции f:
; m[b] = 1;
mov eax, [ebp +0x19];?
mov byte ptr [eax + 0x4036a0], 1
; m[a+a+a] = 0;
mov edx, [ebp+0x08]
mov byte ptr [edx+0x4036a0], 0;??
странно да? Особенно то, как компилер высчитал переменную b, в честь чего это ее адрес стал ebp+0x19?
если заменить m[a+a+a] = 0; на m[a*3] = 0; то ошибки не будет: ; m[b] = 1;
mov eax, [ebp +0x0c]
mov byte ptr [eax + 0x4036a0], 1
; m[a*3] = 0;
mov edx, [ebp+0x08]
lea edx, [edx+edx*2]
mov byte ptr [edx+0x4036a0], 0
Глюк четко проявляется в Builder C++ 5.0 + Update Pack1.
|
Может у кого-нибудь есть ещё примеры не корректной работы компилятора? Или обьяснение о причинах глюка?
Отредактировано Георгий — 21 Jun 2003, 18:11 |
|
Asher |
Отправлено: 22.06.2003, 20:27 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Вот еще пример (наверняка это заметили и до меня и где-то уже пробегало, я не в курсе)
CODE |
//---------------------------------------------------------------------------
#pragma hdrstop
#include "stdio.h"
#include <memory>
#include <string>
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
std::auto_ptr < std::string >string1( new std::string("Text\n"));
std::auto_ptr < std::string >string2;
string2 = string1;
if(string1.get() != NULL)
printf("string1 %s", string1.get()->c_str());
if(string2.get() != NULL)
printf("string2 %s", string2.get()->c_str());
return 0;
}
//--------------------------------------------------------------------------- |
На печать входит только string2 Text
При копировании string2 = string1; string1 становится NULL
|
|
|