This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/38364] New: -ftrapv triggers integer miscompilation
- From: "regehr at cs dot utah dot edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 2 Dec 2008 03:44:18 -0000
- Subject: [Bug c/38364] New: -ftrapv triggers integer miscompilation
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Seen on Ubuntu Hardy using r142342.
regehr@john-home:~/volatile/tmp73$ current-gcc -O2 -Wall small.c -o small
regehr@john-home:~/volatile/tmp73$ ./small
0
regehr@john-home:~/volatile/tmp73$ current-gcc -O2 -ftrapv -Wall small.c -o
small
regehr@john-home:~/volatile/tmp73$ ./small
1
regehr@john-home:~/volatile/tmp73$ current-gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --program-prefix=current-
--enable-languages=c,c++ --prefix=/home/regehr : (reconfigured) ../configure
--program-prefix=current- --enable-languages=c,c++ --prefix=/home/regehr :
(reconfigured) ../configure --program-prefix=current- --enable-languages=c,c++
--prefix=/home/regehr : (reconfigured) ../configure --program-prefix=current-
--prefix=/home/regehr --enable-languages=c,c++ --no-create --no-recursion
Thread model: posix
gcc version 4.4.0 20081202 (experimental) (GCC)
regehr@john-home:~/volatile/tmp73$ cat small.c
#include <stdio.h>
#include <stdint.h>
static inline int16_t
safe_mul_int16_t_s_s (int16_t si1, int16_t si2)
{
if (si1 > 0)
{
if (si2 > 0)
{
if (si1 > ((32767) / si2))
{
return si1;
}
}
else
{
if (si2 < ((-32767 - 1) / si1))
{
return si1;
}
}
}
else
{
if (si2 > 0)
{
if (si1 < ((-32767 - 1) / si2))
{
return si1;
}
}
else
{
if ((si1 != 0) && (si2 < ((32767) / si1)))
{
return si1;
}
}
}
return si1 * si2;
}
static inline int8_t
safe_sub_int8_t_s_s (int8_t si1, int8_t si2)
{
if (((si1 ^ si2) &
(((si1 ^ ((si1 ^ si2) & (1 << (sizeof (int8_t) * 8 - 1)))) -
si2) ^ si2)) < 0)
{
return si1;
}
return si1 - si2;
}
uint32_t g_38;
int32_t func_53 (int32_t p_54, uint32_t p_55);
int32_t func_53 (int32_t p_54, uint32_t p_55)
{
safe_mul_int16_t_s_s (1, 1);
return 1;
}
int32_t func_97 (uint16_t p_99);
int32_t func_97 (uint16_t p_99)
{
g_38 = p_99;
return 1;
}
int32_t func_120 (int32_t p_124);
int32_t func_120 (int32_t p_124)
{
if (safe_sub_int8_t_s_s (p_124, 1))
safe_mul_int16_t_s_s (1, func_97 (1));
return p_124;
}
int32_t func_14 (uint32_t p_16);
int32_t func_14 (uint32_t p_16)
{
uint32_t l_438 = 0;
func_97 (p_16 < (1 != func_120 (l_438)));
return p_16;
}
int main (void)
{
func_14 (1);
printf ("%d\n", g_38);
return 0;
}
--
Summary: -ftrapv triggers integer miscompilation
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: regehr at cs dot utah dot edu
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38364