vak: (Default)
[personal profile] vak
Сложить два целых числа, вернуть целое. Породить исключение в случае арифметического переполнения.
int add(int a, int b);
Удивительно, сколько народу обламывается на этой задачке.

Date: 2020-08-02 20:44 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
В общем случае UB никак нельзя найти автоматически, и в этом заключается один из фундаментальных дефектов языка. Это как с сусликом, которого ты не видишь, а он есть.
Но в частности есть т.н. UndefinedBehaviorSanitizer. Есть ещё немножко таких.

Преобразование unsigned int в signed int в случае переполнения даёт или implementation-defined число или implementation-defined signal.
Ну и там ещё нужно не забывать про представление чисел со знаком, коих три варианта, т.е. возможны два разных диапазона в одном и том же числе битов.

Date: 2020-08-02 22:49 (UTC)
sobriquet9: (Default)
From: [personal profile] sobriquet9
clang++ с ключом -fsanitize=signed-integer-overflow молчит, с ключом -S выдаёт ассемблерную инструкцию addl %edi, %eax которая работает одинаково что с int, что с unsigned.

Поскольку компилятора стандарта C++ нет, это мне напоминает историю с фальшивой банкнотой. Если никто её не может отличить от настоящей, значит её можно считать настоящей.