vak: (Default)
[personal profile] vak
Исчерпывающий ответ на задачу сложить два числа дал [personal profile] spamsink : https://vak.dreamwidth.org/659406.html?thread=5230798#cmt5230798

Вот код на Си++, решающий поставленную задачу, не вызывая неопределённого поведения и не прибегая к трюкам.
int add(int a, int b)
{
int sum;

if (a >= 0) {
if (b >= 0) {
// Оба числа положительные - сместим на верхнюю границу.
sum = (a - INT_MAX) + b;
if (sum > 0)
throw std::overflow_error("Integer overflow");
sum += INT_MAX;
} else {
// Разные знаки, нет переполнения.
sum = a + b;
}
} else {
if (b >= 0) {
// Разные знаки, нет переполнения.
sum = a + b;
} else {
// Оба числа отрицательные - сместим на нижнюю границу.
sum = (a - INT_MIN) + b;
if (sum < 0)
throw std::overflow_error("Integer overflow"); sum += INT_MIN;
}
}
return sum;
}
Как видите, вовсе не теорема Ферма. Not a rocket science, как говорят американцы. Последовательность простых логических рассуждений.

Вот по этой причине физики не любят Си и Си++. Вы даже два числа сложить не можете без фокусов, говорят они. :)

Заметим, что проблема undefined behavior в арифметике свойственна только Си/Си++. Во многих современных языках, таких как Java, Go или Rust, она отсутствует.
dememax: (коварство)
From: [personal profile] dememax
Стоп! Всему - свой инструмент!
С динамикой - валгринд отлично справляется, там среди опций - всё, что угодно можно делать.
Другое дело, не везде этот инструмент можно запустить, если у вас там совсем эмбеддед.
dememax: (glider)
From: [personal profile] dememax
О, это - тема, конечно.
"Нормальные проекты" сами поставляют для своих пользователей файлы подавления нежелательных сообщений (gstreamer, glib, ...).
А потом, зря вы юнит-тесты пишите что ли!?
Самый простой тест (типа, создали компонент) уже может дать возможность для создания файла подавления или нахождения самых банальных ошибок (либо убедиться, что их нет).
Понятное дело, что если все тесты запускать - то "туши свет", особенно если много фолс позитивз.
"Разделяй и властвуй!"