Бага в VC++ с отрицательными i16 значениями
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.08.19 05:30
Оценка: 1 (1) :))
Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе 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 значениями
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 20.08.19 06:06
Оценка:
Здравствуйте, 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.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 26.08.2019 8:48 DDDX . Предыдущая версия .
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 значениями
От: vopl Россия  
Дата: 20.08.19 08:48
Оценка: 21 (3) +3
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Вкратце: -1i16 преобразуется в int, а не в short.


В принципе, они правы. Отрицательных литералов не бывает, минус всегда обрабатывается как арифметическая операция, далее случается "Integral promotion", смотри, например, тут https://en.cppreference.com/w/cpp/language/implicit_conversion

добавка: то же самое происходит с char, http://ideone.com/eMhnTj
Отредактировано 20.08.2019 8:52 vopl . Предыдущая версия .
Re[2]: Бага в VC++ с отрицательными i16 значениями
От: TailWind  
Дата: 20.08.19 09:10
Оценка:
КД>>Вкратце: -1i16 преобразуется в int, а не в short.

Интересно что выдаёт: test_func(0i16 — 1i16)
Re[2]: Бага в VC++ с отрицательными i16 значениями
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 21.08.19 05:39
Оценка:
Здравствуйте, vopl, Вы писали:

КД>>Вкратце: -1i16 преобразуется в int, а не в short.


V>В принципе, они правы. Отрицательных литералов не бывает, минус всегда обрабатывается как арифметическая операцияу


Похоже, да. Я с этой стороны на эту проблему не смотрел. Спасибо!
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.