LINUX.ORG.RU

Как дальше жить ? Или куда идет GCC(C)

 ,


1

5

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

Ответ на: комментарий от zaz

sofia-sip-ua

Возьми из Freeswitch-а. Они у себя эту либу регулярно ровняют.

dvl36
()
Ответ на: комментарий от kawaii_neko

Хочу присоединиться к малочисленной группе, которая считает, что gcc в данном случае генерирует ахинею вместо кода.

+1. По моим воспоминаниям о K&R C, этот код должен работать как задумано. Или нынче kv[-1] тоже стало нельзя?

pef-secure
()

А если добавить kv_t *kvp = dict->kv1 и сделать через инкремент указателя? Тоже сумничает?

pef-secure
()
Ответ на: комментарий от emulek

Отрысь! Не тебе, мешку с патологиями, тут рот раскрывать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.