This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Miscompilation of remainder expressions
Andrew Haley <aph@redhat.com> writes:
| Roberto Bagnara writes:
| > Andrew Haley wrote:
| > > Roberto Bagnara writes:
| > > >
| > > > Reading the thread "Autoconf manual's coverage of signed integer
| > > > overflow & portability" I was horrified to discover about GCC's
| > > > miscompilation of the remainder expression that causes INT_MIN % -1
| > > > to cause a SIGFPE on CPUs of the i386 family. Are there plans to
| > > > fix this bug (which, to me, looks quite serious)?
| > >
| > > No, there aren't. It would make more sense for you to wrap % in some
| > > code that checks for this, rather than for us to slow down every division
| > > for this one special case.
| >
| > With all due respect, I must say I am shocked. I always thought
| > (and taught) that we, Free Software people, value standard conformance
| > and getting things right.
|
| This is a disgreement about interpretation of the langauge in the
| standard, which is:
|
| "The result of the / operator is the quotient from the division of the
| first operand by the second; the result of the % operator is the
| remainder. In both operations, if the value of the second operand is
| zero, the behavior is undefined. When integers are divided, the result
| of the / operator is the algebraic quotient with any fractional part
| discarded.87) If the quotient a/b is representable, the expression
| (a/b)*b + a%b shall equal a."
|
| If the quotient a/b is *not* representable, is the behaviour of %
| well-defined or not? It doesn't say.
Andrew and me exchanged (private) viewpoints of this yesterday. I would
like to add something I forgot to say.
By definition, the absolute value of "a % b" is always less than the
absolute value of b. Consequently, "a % b" is always defined.
-- Gaby