[Bug c/96040] New: Compiled code causes SIGBUS at -O2
josephcsible at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Jul 2 21:21:36 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96040
Bug ID: 96040
Summary: Compiled code causes SIGBUS at -O2
Product: gcc
Version: 10.1.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: josephcsible at gmail dot com
Target Milestone: ---
Target: x86_64-linux-gnu
Consider this C code:
int puts(const char *);
int snprintf(char *, unsigned long, const char *, ...);
unsigned long strspn(const char *, const char *);
struct TValue {
union {
long long i;
double n;
} value_;
unsigned char tt_;
};
static int tostringbuff (struct TValue *num, char *str) {
int len;
if (num->tt_ == 3) {
len = snprintf(str,50,"%lld",num->value_.i);
} else {
len = snprintf(str,50,"%.14g",num->value_.n);
if (str[strspn(str, "-0123456789")] == '\0') {
str[len++] = '.';
str[len++] = '0';
}
}
return len;
}
void unused (int *buff, struct TValue *num) {
char junk[50];
*buff += tostringbuff(num, junk);
}
char space[400];
void addnum2buff (int *buff, struct TValue *num) __attribute__((__noinline__));
void addnum2buff (int *buff, struct TValue *num) {
*buff += tostringbuff(num, space);
}
int main(void) {
int buff = 0;
struct TValue num;
num.value_.n = 1.0;
num.tt_ = 19;
addnum2buff(&buff, &num);
puts(space);
}
It's supposed to print "1.0". When compiled with "gcc -O2", it instead crashes
with SIGBUS. This appears to be a regression, since it works fine on GCC 9.
The minimization is my own, but the bug was originally found in the wild by
actboy168 compiling Lua 5.4.0 on Arch Linux:
http://lua-users.org/lists/lua-l/2020-07/msg00001.html
https://godbolt.org/z/RMc3RX
More information about the Gcc-bugs
mailing list