VC++7.1 BUG
От: WolfHound  
Дата: 17.03.04 16:33
Оценка: 8 (1) +1 -1
#Имя: FAQ.tools.vc71.bugs1
#define INV_RAND_MAX (1.0f / float(0x7fff))

class CRandGen
{
public:
    CRandGen() : m_seed(1L) {}  

    CRandGen( unsigned int seed ) : m_seed(seed) {}  

    void Init( unsigned int seed )  { m_seed = seed; }
        
    float RandFloat() { return float(RandInt()) * INV_RAND_MAX; }

    int RandInt()
    {
        m_seed = m_seed * 214013L + 2531011L;
        return((m_seed >> 16) & 0x7fff);
    }

private:
    unsigned long  m_seed;
};

void test(float x, float y, float z)
{
    std::cout<<x<<"\n"<<y<<"\n"<<z<<"\n";
}
int main()
{
    float k=123;
    CRandGen m_randGen;
    test((m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k 
        );
    test((m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k 
        );
    test((m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k
        ,(m_randGen.RandFloat() - 0.5f)*k 
        );
    return 0;
}

Релиз
-37.7236
-37.7236
-37.7236
-2.47562
-2.47562
-2.47562
39.7093
39.7093
39.7093
Дебуг
-37.7236
7.82099
-61.3461
-2.47562
10.4561
37.9751
39.7093
48.7034
-18.4142

Самое смешное что побочные эффекты на месте но не поле кажного вызова, а после всех.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: VC++7.1 BUG
От: Евгений Коробко  
Дата: 18.03.04 14:04
Оценка:
Очевидно, что компилятор неправильно оптимизирует код — вычисляет аргумент один раз. Следовательно, в релиз-версии нужно эту оптимизацию отключить
Евгений Коробко
Re: VC++7.1 BUG
От: shmakov Россия  
Дата: 12.10.04 12:25
Оценка:
Не знаю — попробовал — у меня в Debug & Release один и тот же результат... VS.NET — 2003
-37.7236
-37.7236
-37.7236
-2.47562
-2.47562
-2.47562
39.7093
39.7093
39.7093
Re: VC++7.1 BUG
От: Шахтер Интернет  
Дата: 12.10.04 16:07
Оценка:
Здравствуйте, WolfHound, Вы писали: ...

Сталкивался с аналогичной проблемой. Раскоп показал, что, похоже, компилятор забывает вставить точку следования после вызова функции. Это не имеет значения для вызываемых функций, но для встроенных приводит к эффектам описаным выше, когда безобидный unspecified behavior превращается в злобный undefined behavior.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: VC++7.1 BUG
От: siv Украина  
Дата: 29.08.06 06:41
Оценка: 1 (1)
Уже не актуально. После установки SP1 генерирует в релизе правильный код.
Re[2]: VC++7.1 BUG
От: WolfHound  
Дата: 29.08.06 09:33
Оценка:
Здравствуйте, siv, Вы писали:

siv>Уже не актуально. После установки SP1 генерирует в релизе правильный код.

На дату посмотри чтоли.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: VC++7.1 BUG
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 29.08.06 15:55
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

siv>>Уже не актуально. После установки SP1 генерирует в релизе правильный код.

WH>На дату посмотри чтоли.

Сообщение о неактуальности в любом случае уместно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.