Do I have a gcc optimization bug or a C code problem?

前端 未结 9 2380
借酒劲吻你
借酒劲吻你 2021-02-06 00:57

Test the following code:

#include 
#include 
main()
{
    const char *yytext=\"0\";
    const float f=(float)atof(yytext);
    siz         


        
9条回答
  •  不要未来只要你来
    2021-02-06 01:46

    Use the compiler flag -fno-strict-aliasing.

    With strict aliasing enabled, as it is by default for at least -O3, in the line:

    size_t t = *((size_t*)&f);
    

    the compiler assumes that the size_t* does NOT point to the same memory area as the float*. As far as I know, this is standards-compliant behaviour (adherence with strict aliasing rules in the ANSI standard start around gcc-4, as Thomas Kammeyer pointed out).

    If I recall correctly, you can use an intermediate cast to char* to get around this. (compiler assumes char* can alias anything)

    In other words, try this (can't test it myself right now but I think it will work):

    size_t t = *((size_t*)(char*)&f);
    

提交回复
热议问题