Ответ на задачку по Си
2020-08-03 12:14Исчерпывающий ответ на задачу сложить два числа дал
spamsink : https://vak.dreamwidth.org/659406.html?thread=5230798#cmt5230798
Вот код на Си++, решающий поставленную задачу, не вызывая неопределённого поведения и не прибегая к трюкам.
Вот по этой причине физики не любят Си и Си++. Вы даже два числа сложить не можете без фокусов, говорят они. :)
Заметим, что проблема undefined behavior в арифметике свойственна только Си/Си++. Во многих современных языках, таких как Java, Go или Rust, она отсутствует.
Вот код на Си++, решающий поставленную задачу, не вызывая неопределённого поведения и не прибегая к трюкам.
Как видите, вовсе не теорема Ферма. Not a rocket science, как говорят американцы. Последовательность простых логических рассуждений.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;
}
Вот по этой причине физики не любят Си и Си++. Вы даже два числа сложить не можете без фокусов, говорят они. :)
Заметим, что проблема undefined behavior в арифметике свойственна только Си/Си++. Во многих современных языках, таких как Java, Go или Rust, она отсутствует.

Санитайзеры
Date: 2020-08-06 20:05 (UTC)Re: память выделяется динамически
Date: 2020-08-06 20:11 (UTC)С динамикой - валгринд отлично справляется, там среди опций - всё, что угодно можно делать.
Другое дело, не везде этот инструмент можно запустить, если у вас там совсем эмбеддед.
Re: память выделяется динамически
Date: 2020-08-06 21:22 (UTC)Re: память выделяется динамически
Date: 2020-08-07 07:40 (UTC)"Нормальные проекты" сами поставляют для своих пользователей файлы подавления нежелательных сообщений (gstreamer, glib, ...).
А потом, зря вы юнит-тесты пишите что ли!?
Самый простой тест (типа, создали компонент) уже может дать возможность для создания файла подавления или нахождения самых банальных ошибок (либо убедиться, что их нет).
Понятное дело, что если все тесты запускать - то "туши свет", особенно если много фолс позитивз.
"Разделяй и властвуй!"