Бага в VC++ с отрицательными i16 значениями
Сегодня закрыли (без исправлений)
мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение .
Вкратце: -1i16 преобразуется в int, а не в short.
Нарваться сложно, но можно.
В текущей VS2019-ой (16.2.2) бага присутствует. Только что проверил.
Будьте осторожны
PS. Кажись, здесь я про неё не писал...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Бага в VC++ с отрицательными i16 значениями
От:
LaptevVV
Дата: 20.08.19 05:48
Оценка:
КД>Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение .
КД>Вкратце: -1i16 преобразуется в int, а не в short.
И становится положительным?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Бага в VC++ с отрицательными i16 значениями
Здравствуйте, LaptevVV, Вы писали:
КД>>Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение .
КД>>Вкратце: -1i16 преобразуется в int, а не в short.
LVV>И становится положительным?
Нет. Но было бы неплохо, кстати
-1i16 преобразуется в (int)-1.
#include <iostream>
void TEST_FUNC(int) { std::cout<<"TEST_FUNC(int)"<<std::endl; }
void TEST_FUNC(short) { std::cout<<"TEST_FUNC(short)"<<std::endl; }
int main()
{
TEST_FUNC(-1i16); // <----- call of TEST_FUNC(int) !!!
TEST_FUNC((short)-1i16);
TEST_FUNC(1i16);
auto v=-1i16;
std::cout<<"TYPE:"<<typeid(v).name()<<std::endl;
std::cout<<"TYPE:"<<typeid(-1i16).name()<<std::endl;
return 0;
}
--------------------------------------------------------------
Actual Output:
TEST_FUNC(int)
TEST_FUNC(short)
TEST_FUNC(short)
TYPE:int
TYPE:int
Expected Output:
TEST_FUNC(short)
TEST_FUNC(short)
TEST_FUNC(short)
TYPE:short
TYPE:short
Нарваться можно, к примеру, в процессе формирования VARIANT-подобных объектов.
Будет вызываться не тот оператор присваивания и, как следствие, назначаться VT_I4 вместо VT_I2.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Бага в VC++ с отрицательными i16 значениями
От:
LaptevVV
Дата: 20.08.19 07:30
Оценка:
КД>>>Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение .
КД>>>Вкратце: -1i16 преобразуется в int, а не в short.
LVV>>И становится положительным?
КД>Нет. Но было бы неплохо, кстати
Не, это как раз будет большой ошибкой.
КД>-1i16 преобразуется в (int)-1.
То есть, проблема в изменении размера.
КД>Нарваться можно, к примеру, в процессе формирования VARIANT-подобных классов.
КД>Будет вызываться не тот оператор присваивания и, как следствие, назначаться VT_I4 вместо VT_I2.
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Бага в VC++ с отрицательными i16 значениями
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Вкратце: -1i16 преобразуется в int, а не в short.
В принципе, они правы. Отрицательных литералов не бывает, минус всегда обрабатывается как арифметическая операция, далее случается "Integral promotion", смотри, например, тут
https://en.cppreference.com/w/cpp/language/implicit_conversion
добавка: то же самое происходит с char,
http://ideone.com/eMhnTj
Re[2]: Бага в VC++ с отрицательными i16 значениями
От:
TailWind
Дата: 20.08.19 09:10
Оценка:
КД>>Вкратце: -1i16 преобразуется в int, а не в short.
Интересно что выдаёт: test_func(0i16 — 1i16)
Re[2]: Бага в VC++ с отрицательными i16 значениями
Здравствуйте, vopl, Вы писали:
КД>>Вкратце: -1i16 преобразуется в int, а не в short.
V>В принципе, они правы. Отрицательных литералов не бывает, минус всегда обрабатывается как арифметическая операцияу
Похоже, да. Я с этой стороны на эту проблему не смотрел. Спасибо!
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить