Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Арифметическое исключение SIGFPE в C
Проверьте целочисленное деление, остатки и диапазоны, даже если ошибка упоминает плавающую точку.

SIGFPE может быть следствием недопустимой арифметической операции, включая целочисленное деление на ноль. Историческое название не означает обязательного использования float или double. Отображаемый код выхода зависит от соглашений среды.
Проверяйте делитель перед / и %. Убедитесь в успешности ввода: в вычисление может попасть неинициализированное или неожиданное значение. Для знаковых целых также опасен результат деления, не помещающийся в тип.
Выделите операнды, вызывающие сбой, и проверяйте диапазон до вычисления. Не переносите правила целочисленного деления на плавающую точку: её поведение зависит от среды и настроек.
Код C
#include <stdio.h>
#include <limits.h>
int safe_divide(int a, int b, int *out_result) {
if (b == 0) {
return -1; // Error: division by zero
}
// Protect against INT_MIN / -1 signed overflow
if (a == INT_MIN && b == -1) {
return -2; // Error: signed integer overflow
}
*out_result = a / b;
return 0; // Success
}
int main(void) {
printf("=== Safe Integer Division Demo ===\n");
int test_cases[][2] = {
{100, 5},
{100, 0},
{INT_MIN, -1},
{42, 7}
};
int num_tests = sizeof(test_cases) / sizeof(test_cases[0]);
for (int i = 0; i < num_tests; i++) {
int a = test_cases[i][0];
int b = test_cases[i][1];
int result = 0;
int status = safe_divide(a, b, &result);
if (status == 0) {
printf("[OK] %d / %d = %d\n", a, b, result);
} else if (status == -1) {
printf("[GUARDED] Division by zero rejected for %d / %d\n", a, b);
} else if (status == -2) {
printf("[GUARDED] INT_MIN / -1 overflow rejected for %d / %d\n", a, b);
}
}
printf("All divisions validated safely without SIGFPE crashes.\n");
return 0;
}Открыть в компилятореОжидаемый вывод
=== Safe Integer Division Demo === [OK] 100 / 5 = 20 [GUARDED] Division by zero rejected for 100 / 0 [GUARDED] INT_MIN / -1 overflow rejected for -2147483648 / -1 [OK] 42 / 7 = 6 All divisions validated safely without SIGFPE crashes.
Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.