c++ - 运行时发生奇怪的崩溃

标签 c++ gcc undefined-behavior modulus

有谁知道,为什么以下代码在使用 g++ 编译时会崩溃?

#include <iostream>

unsigned long getSumDivisors(const unsigned long number) {
    unsigned long sum = 0;
    for(unsigned long i = 0; i < number; ++ i) {
        if(number % i == 0) {
            sum += i;
        }
    }
    return sum;
}

int main() {
    std::cout << getSumDivisors(5);
    return 0;
}

当我删除 sum += i;它不会崩溃。

我尝试在 windows 和 linux linaro 下编译它

g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 版权所有 © 2012 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅来源。没有 保修单;甚至不是为了特定目的的适销性或适用性。

g++ (tdm-2) 4.8.1 版权所有 (C) 2013 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅来源。没有 保修单;甚至不是为了特定目的的适销性或适用性。

最佳答案

它会导致 SIGFPE。原因是因为被零除:

if(number % i == 0)

你可以在这里修复它:

 for(unsigned long i = 1; i < number; ++ i)

SIGFPE 通常会在具有浮点单元的系统上发生,在这种情况下会引发异常。实际行为取决于实现细节并且未定义。在具有浮点仿真库的旧系统上,它可能返回 0 或随机结果。

关于c++ - 运行时发生奇怪的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732822/

相关文章:

c++ - 问题更改选项卡QTabWidget和QScrollArea Qt

mysql - DBD-mysql错误: CPU you selected does not support x86-64 instruction set

c - C 编程中未知边界用法的数组

c - 为什么空数组的字符串长度与数组大小不同?

c++ - 在 C++ lldb 中使用重载运算符评估表达式

c++ - 尝试使用unique_ptr的 vector 引用已删除的函数

c - 使用 SSE 将 4 个 float 乘以 4 个 float 的最有效方法是什么?

使用不同大小的字符串文字初始化给定大小的静态字符数组会导致未定义的行为吗?

c++ - 在 C++ 中获取字符串的第一个字符有什么最佳实践吗?

c - 带有数组的简单 C 程序未打印正确的输出