运行时发生奇怪的崩溃

use*_*608 2 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;
}
Run Code Online (Sandbox Code Playgroud)

当我删除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.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

Dev*_*lus 5

它会导致SIGFPE.原因是因为除以零:

if(number % i == 0)
Run Code Online (Sandbox Code Playgroud)

你可以在这里解决它:

 for(unsigned long i = 1; i < number; ++ i)
Run Code Online (Sandbox Code Playgroud)

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