Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC Warns About Function Pointer to Object Pointer Cast

Clearly casting between function pointers and object pointers is undefined behaviour in the general sense, but POSIX (see: dlsym) and WinAPI (see: GetProcAddress) require this.

Given this, and given the fact that such code is targeting a platform-specific API anyway, its portability to platforms where function pointers and object pointers aren't compatible is really irrelevant.

But -Wpedantic warns about it anyway, and #pragma GCC diagnostic ignored "-Wpedantic" has no effect:

warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [enabled by default]

I want to keep -Wpedantic enabled, since it does give good warnings, but I don't want to have real warnings and errors lost amidst a sea of irrelevant warnings about function pointer to object pointer casts.

Is there a way to accomplish this?

Running GCC 4.8.0 on Windows (MinGW):

gcc (rubenvb-4.8.0) 4.8.0

CODE SAMPLE

#include <windows.h>
#include <iostream>


int main (void) {

    std::cout << *reinterpret_cast<int *>(GetProcAddress(LoadLibraryA("test.dll"),"five")) << std::endl;

}

Emits (with -Wpedantic):

warning_demo.cpp: In function 'int main()':
warning_demo.cpp:7:87: warning: ISO C++ forbids casting between pointer-to-funct
ion and pointer-to-object [enabled by default]
  std::cout << *reinterpret_cast<int *>(GetProcAddress(LoadLibraryA("test.dll"),
"five")) << std::endl;

       ^
like image 589
Robert Allan Hennigan Leahy Avatar asked Apr 15 '13 23:04

Robert Allan Hennigan Leahy


1 Answers

I think you could use g++'s system_header directive here:

wrap_GetProcAddress.h:

#ifndef wrap_GetProcAddress_included
#define wrap_GetProcAddress_included

#pragma GCC system_header

template <typename Result>
Result GetProcAddressAs( [normal parameters] )
{
    return reinterpret_cast<Result>(GetProcAddressAs( [normal parameters] ));
}

#endif
like image 172
Mark B Avatar answered Oct 15 '22 09:10

Mark B