Недавно занимался портированием рабочей системы на новый дистр (с целью тестирование и подготовкой будущего возможного апдейта продакшена). Столкнулся с тем что одна из используемых опенсорсных либ (либа уже года 3 как не развивается) не работает при сборке новым GCC с оптимизацией. Проковырялся целый день нашел в чем проблема - синтезировал простенький тест проверил в старых GCC + CLANG все ок, при сборке новым GCC (4.7 +) с -O2 не работает (c -O0 работает). Отписался GCC говорят и не должно работать так как GCC не потдерживает более язык С а работает только с ISO C - а с точки зрения стандарта ISO С код не рабочий. Вот интересно мнение общественности нужна ли потдержка компилятором такого кода (конкретно метода searchDict2):
#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;
}
$ gcc test.c -O0 -o ./test-O0 && ./test-O0 Found1 -4 Found2 -4 $ gcc test.c -O2 -o ./test-O2 && ./test-O2 Found1 -4 Bus error $ gcc test.c -O2 -fno-aggressive-loop-optimizations -o ./test-O2-nalo && ./test-O2-nalo Found1 -4 Found2 -1