Arithmetic Exception in gdb, but I'm not dividing by zero?

crognale picture crognale · Dec 31, 2012 · Viewed 42.7k times · Source

I've been getting a Floating point exception (core dumped) error in my C++ program, and gdb shows that the problem is on a line that performs modulo division:

Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0x7ffff6804700 (LWP 13931)]
0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
    at exp.cpp:55
55              return (r==0) ? 0 : l % r;

The line guards against dividing by zero, and my backtrace shows the following:

#0  0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
    at exp.cpp:55
        l = -2147483648
        r = -1

Since I know I'm not dividing by zero, what else could possibly be causing the exception?

Answer

crognale picture crognale · Dec 31, 2012

So I figured out what was causing the problem -- An arithmetic exception can be triggered either by dividing by zero, or overflow of a signed integer, which is what happened here. Unsigned integers are required to wrap around when overflowed; the behavior for signed integers is undefined.