This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Floating Point Exception in Integer Math?


Hi Jay,

On Fri, Jul 29, 2011 at 3:59 PM, Jay K <jay.krell@cornell.edu> wrote:
> ?> I'm testing signed int32 operations (division, modular reduction, and
> ?> overflow), and came across a floating point exception:
>
> ?>? int32_t aa = INT32_MIN;
> ?>? int32_t bb = -1;
> ?>? int32_t rr = aa % bb;
> ?>
> ?>? cout << rr << " = " << aa << " % " << bb << endl;
>
> ?> There's not much to the command line: `g++ sitest.cpp -o sitest.exe`.
> ?> I was kind of surprised GCC [silently] moved from the integer domain
> ?> to the floating point domain.
>
> ?> Is this expected behavior?
>
> What occurs here is implementation defined.
> See also 1 / 0.
Thanks. So its apparently undefined for GCC, and its consistent with
Seacord's Secure Programming Guide (see INT33-CPP at [1]).

Interestingly, using Crypto++ Integers (which don't suffer limited
data ranges) and MSVC, both arrive at 0.

> Gcc didn't do anything floating point-related.
> Integer operations esp. division and mod can have "exceptions" or "traps" or
> such.
The OS message "Floating point exception" was a bit misleading. (I
don't think it was unreasonable to guess the floating point unit
generated the floating point exception).

> Look at the assembly code.
> g++ -S -c sitest.cpp
> vi sitest.S
You are right - the idiv is there:

	movl	$-2147483648, -4(%rbp)
	movl	$-1, -8(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %edx
	sarl	$31, %edx
	idivl	-8(%rbp)

Thanks for the help. They were the results I was looking for, I just
did not recognize it.

Jeff

[1] https://www.securecoding.cert.org/confluence/display/cplusplus/INT33-CPP.+Ensure+that+division+and+modulo+operations+do+not+result+in+divide-by-zero+errors


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]