Недавно занимался портированием рабочей системы на новый дистр (с целью тестирование и подготовкой будущего возможного апдейта продакшена). Столкнулся с тем что одна из используемых опенсорсных либ (либа уже года 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











