LINUX.ORG.RU

Приведение типов без warning`ов


0

0

Привет,товарищи! Линуксойд я молодой (типа неопытный), поэтому всех тонкостей программирование под *nix`ы ещё не усвоил и порой gcc выдает сюрпризы.

Вообщем при компиляции вылетает такая весчь: warning: dereferencing type-punned pointer will break strict-aliasing rules

При таком вызове метода: CRC_File(SECURITY_FILE, (unsigned long&)dwXmlCRC);

Параметр dwXmlCRC имеет тип uint32. Методу, понятно, нужен тип unsigned long&.

Подобный ворнинг выскакивал и в другом месте, но с другими типами. Обходил промежуточным приведением к void`у...но в этом случае такое приведение недопустимо...Очень хотелось бы избавится от ворнинга...к тому же он последний в проге, и будет она чистенькая чистенькая! Вариант с использованием флага компиляции -fno-strict-aliasing не канает...ибо надо не скрыть его,а победить! Кто что подскажет?

Re: Приведение типов без warning`ов

Судя по всему, параметр имеет тип неконстантной ссылки. Значит, это out-параметр. Нельзя туда запихивать ничего альтернативного, это должно быть очевидно максимум после 15 сек. шевеления мозгами.

Т.е. альтернатива:

unsigned long tmp = dwXmlCRC;
CRC_File(SECURITY_FILE, tmp);
dwXmlCRC = tmp;

Это что, 64-битная платформа, где ulong != uint32?

watashiwa_daredeska ★★★★ ()

Re: Приведение типов без warning`ов

*(unsigned long*)&dwCmlCRC

За dw - давить.

anonymous ()

Re: Приведение типов без warning`ов

>warning: dereferencing type-punned pointer will break strict-aliasing >rules

есть такая фишка как strict-aliasing,
вкратце компилятор может предсказать как и где меняется твои переменные, и соотвественно переупорядочить код для достижения каких-либо критерием оптимальности: скорость, размер и т.д.,

например,

int a;
int * = &a;

"p" это "alias" на "a",

согласно стандарту C99 alias скажем short * на int не законен,
т.е. скажем
int foo()
{
        int a = 0;
        short *p = (short *)&a;
        short *q = p + 1;
        *p = 12;
        *q = 40;
        return a;
}

неверно, т.к. создается alias на "a" типа short *, тогда как "a" имеет тип int.

fghj ★★★★★ ()
Ответ на: Re: Приведение типов без warning`ов от fghj

Re: Приведение типов без warning`ов

Спасибо за советы! Просто первый раз столкнулся с такой проблемкой. Опыта маловато ещё. А стандарт надо бы почитывать изредко все таки! ;)

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