https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64185
Bug ID: 64185
Summary: Optimized code gives unexpected results
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: zaz at ua7 dot net
Created attachment 34191
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34191&action=edit
Test code for reproduce problem
Hello
I found a open-source SIP library sofia-sip-ua work incorrect with GCC 4.7.3
and above. For me it looks like GCC optimization/compilation issue. I have
reproduce some problem on small test application (full code in attachment):
#include <stdio.h>
struct kv_s
{
int k;
int v;
};
typedef struct kv_s kv_t;
struct dict_s
{
kv_t kv1[1];
kv_t kv2[1];
kv_t kv3[1];
kv_t kv4[1];
kv_t kv5[1];
kv_t kv6[1];
kv_t kv7[1];
kv_t kv8[1];
};
typedef struct dict_s dict_t;
void initDict(dict_t *dict)
{
dict->kv1[0].k = 1;
dict->kv1[0].v = -1;
dict->kv2[0].k = 2;
dict->kv2[0].v = -2;
dict->kv3[0].k = 3;
dict->kv3[0].v = -3;
dict->kv4[0].k = 4;
dict->kv4[0].v = -4;
dict->kv5[0].k = 5;
dict->kv5[0].v = -5;
dict->kv6[0].k = 6;
dict->kv6[0].v = -6;
dict->kv7[0].k = 7;
dict->kv7[0].v = -7;
dict->kv8[0].k = 8;
dict->kv8[0].v = -8;
}
int searchDict1(dict_t *dict, int key)
{
int i;
kv_t *kvs = dict->kv1;
for(i=0; i<=6; i++)
{
if(key == kvs[i].k)
{
return kvs[i].v;
}
}
return 0;
}
int searchDict2(dict_t *dict, int key)
{
int i;
for(i=0; i<=6; i++)
{
if(key == dict->kv1[i].k)
{
return dict->kv1[i].v;
}
}
return 0;
}
int main(int argc, const char* argv[])
{
dict_t dict;
int res;
initDict( &dict );
res = searchDict1(&dict, 4);
printf("Found1 %i\n", res);
res = searchDict2(&dict, 4);
printf("Found2 %i\n", res);
return 0;
}
Expected otput of this application:
Found1 -4
Found2 -4
But I see next:
$ gcc --version
gcc (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3
$ gcc -O0 -Wall ./test.c -o test-O0 && ./test-O0
Found1 -4
Found2 -4
$ gcc -O2 -Wall ./test.c -o test-O2 && ./test-O2
Found1 -4
Bus error
$ gcc -O2 -fno-aggressive-loop-optimizations -Wall ./test.c -o test-O2-nalo &&
./test-O2-nalo
Found1 -4
Found2 -1
I got similar results on GCC: 4.7.3, 4.8.3 and 4.92
Looks like I reproduced 2 different problems:
1) "Loops do not terminate" which is posted as know issue on
https://gcc.gnu.org/bugs/
2) Something new when build with "-O2 -fno-aggressive-loop-optimizations", code
found incorrect entry.
I agree code looks not clean when I try access a array out of bunds, but a
looks applications use "hack" like this. For my opinion there possible next
solutions for this issue:
1) searchDict2 will return same response as searchDict1 independent of
optimizations.
2) Provide some command line option (like -fno-aggressive-loop-optimizations)
so with this new option + -fno-aggressive-loop-optimizations it work in same
way as searchDict1.
3) Produce a WARNINGS during compilation (if -Wall specify) about possible
logic corrupt during optimizations.
Best Regards
Alex