linux不提供算术溢出异常机制,仅硬件设置of标志;仅int_min/-1除法或浮点异常可能触发sigfpe,需用__builtin_*_overflow检测或fenv.h监控浮点异常。

Linux 系统本身不提供“算术运算溢出异常”这种可直接捕获的运行时异常机制——它不是像 Java 或 Python 那样的高级语言异常,而是底层硬件行为,需结合 CPU 标志、编译器支持与系统信号协同处理。
硬件层面:溢出不自动触发信号
x86/x86_64 CPU 在整数加减乘运算中,即使发生有符号溢出(如 INT_MAX + 1),默认不会产生中断或信号;它只设置标志寄存器(如 OF 溢出标志位),程序继续执行。Linux 内核不会因此发送 SIGFPE —— 这点和除零、浮点异常不同。
只有以下情况会引发信号:
-
有符号整数除法溢出:例如
INT_MIN / -1,CPU 触发 #DE 异常 → 内核转为 SIGFPE - 浮点异常(如 INF、NaN、除零、上溢/下溢):若启用 FPU 异常掩码,可能触发 SIGFPE
- 无符号运算:永不触发任何异常或信号,纯模运算
编译器辅助:启用溢出检查(推荐)
现代 GCC/Clang 提供内置函数,在函数内主动检测并响应溢出:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
__builtin_add_overflow(a, b, &result):返回 true 表示加法溢出 -
__builtin_mul_overflow、__builtin_sub_overflow同理 - 配合
-fsanitize=signed-integer-overflow编译,运行时自动 abort 并报错(开发调试用)
示例:
int safe_add(int a, int b, int* out) {
if (__builtin_add_overflow(a, b, out)) {
fprintf(stderr, "Integer overflow in add(%d, %d)\n", a, b);
return -1;
}
return 0;
}
信号方式:仅适用于特定浮点/除法异常
若你确实在函数中执行了可能触发 SIGFPE 的操作(如除零、INT_MIN/-1、启用 FE_OVERFLOW 的浮点运算),可用 sigaction 捕获:
- 调用
sigemptyset(&sa.sa_mask)、sa.sa_flags = SA_SIGINFO - 注册
sa.sa_sigaction处理器,检查si->si_code区分是FPE_INTDIV(除零)、FPE_INTOVF(整除溢出)还是浮点类 - 注意:不能在 handler 中调用 printf/malloc,应使用
write()输出简单日志
数学函数异常:用 matherr 或 feclearexcept/fetestexcept
对 pow()、log()、sqrt() 等,标准 C 库通过 fenv.h 提供浮点异常控制:
- 调用前
feclearexcept(FE_ALL_EXCEPT) - 运算后
if (fetestexcept(FE_INVALID | FE_OVERFLOW)) { /* 处理 */ } - 旧式
_matherr已被弃用,POSIX 推荐用fenv方式










