This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Q.: inconsistent (?) warnings about functions called through non-compatible types


Hi,

why does gcc (4.4.7 and 4.8.2) sometimes warn and sometimes not warn
when undefined behavior is invoked when making illegal function
pointer conversions?

For instance, consider the code below:

---------
/* Tested with gcc 4.4.7 and 4.8.2 */
#include <stdio.h>
#include <stdbool.h>

bool boolFunctionThatReturnsFalse() { return false; }

typedef int (*intFunction)(void);

int
main()
{
    /* no warning here, just undefined behavior */
    intFunction f = (intFunction) boolFunctionThatReturnsFalse;
    if ( f() )
        printf("true\n");
    else
        printf("false\n");

    /* gcc warns and emits abort code */
    if ( ((intFunction) boolFunctionThatReturnsFalse) () )
        printf("true\n");
    else
        printf("false\n");
}

---------------

Why does assigning boolFunctionThatReturnsFalse to a variable f after
the cast, instead of directly dereferencing it, silence the compiler's
warnings?

Thanks.

 - Godmar

ps: I would like to see the warning, of course, since casting a bool
returning function to an int returning function is undefined behavior.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]