[sisyphus] Странности при переходе объединении двух целых в вещественное на x86_64

Alexey Rusakov ktirf на altlinux.org
Пт Авг 7 17:15:47 MSD 2009


В Птн, 07/08/2009 в 15:59 +0300, Serge Ryabchun пишет: 
> Это не повод собирать не верный код:
> 
> [sr на sr 6]$ gcc-4.3 -Wall -O2 f2.c
> f2.c: In function 'main':
> f2.c:10: warning: dereferencing type-punned pointer will break
> strict-aliasing rules
> [sr на sr 6]$ ./a.out
> TEST 00: 0.000000
> [sr на sr 6]$
> [sr на sr 6]$ gcc-4.4 -Wall -O2 f2.c
> f2.c: In function 'main':
> f2.c:10: warning: dereferencing type-punned pointer will break
> strict-aliasing rules
> [sr на sr 6]$ ./a.out
> TEST 00: 3.140000
По-моему, это вопрос из разряда разрешённости к использованию
конструкции reinterpret_cast<> в С++. Некоторые пользуются. На некоторых
архитектурах и в некоторых условиях результат даже работает. В данном
случае не повезло. Это C, в нём можно почти всё, в том числе и
непринуждённым движением прострелить себе ногу.

> 2009/8/7 Alexey Rusakov <ktirf на altlinux.org>:
> > В Птн, 07/08/2009 в 12:02 +0300, Roman Savochenko пишет:
> >> Kirill A. Shutemov wrote:
> >> > 2009/8/7 Roman Savochenko <rom_as на diyaorg.dp.ua>:
> >> >
> >> >> Kirill A. Shutemov wrote:
> >> >>
> >> >>>>> И во всех трёх вариантах нарушили strict aliasing. Используйте union.
> >> >>>>>
> >> >>>>  ним работает, но это не решение, поскольку приведенные мною обороты
> >> >>>> распространены и я не уверен что подобных проблем нет в других частях
> >> >>>> моей,
> >> >>>> в общем-то не маленькой, программы.
> >> >>>>
> >> >>>>
> >> >>> Есть повод исправить код.
> >> >>>
> >> >>>
> >> >> Я не считаю его ошибочным.
> >> >>
> >> > Strict aliasing rule -- часть стандарта C99. Если вы хотите писать
> >> > быстрый переносимый
> >> > код, то вам стоит следовать этому правилу.
> >> >
> >> Ничего про стандартность тут
> >> http://en.wikipedia.org/wiki/Aliasing_(computing) не увидил. А про то
> >> что существуют конфликты с оптимизаторами там есть.
> > Смотрите внимательнее:
> > "...the ISO standard for the C programming language (including its newer
> > C99 edition) specifies that it is illegal (with some exceptions) for
> > pointers of different types to reference the same memory location."
> >
> > --
> >  Alexey "Ktirf" Rusakov
> >  GNOME Project
> >  ALT Linux Team
> >
> > _______________________________________________
> > Sisyphus mailing list
> > Sisyphus на lists.altlinux.org
> > https://lists.altlinux.org/mailman/listinfo/sisyphus

-- 
  Alexey "Ktirf" Rusakov
  GNOME Project
  ALT Linux Team
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: Эта часть сообщения подписана цифровой подписью
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20090807/050a47a4/attachment.bin>


Подробная информация о списке рассылки Sisyphus