__stdcall__ pointer to member function

Boaz Harrosh boaz at hishome.net
Wed Aug 13 05:15:03 CDT 2003


OK for now I can use -mrtd on the GCC command-line. This will render all 
code to use __stdcall, including the function pointers. This can be 
dangerous with external libraries that where not compiled with this 
switch and have no explicit function prototype.

- Quick browse of GCC stdlib headers show all functions are properly 
prototyped.
- Off course Wine headers are (binary computability WINAPI and all)
- ...

[Q] Does any body know of libraries I should be careful of ?
[Q] Is there a way to make the Compiler/Linker check this thing? (in a 
special makefile)

In C++ code there is no problems since the mangling changes so the 
Linker will complain of undefined symbols.

Boaz Harrosh wrote:

> the GCC (3.2.2) compiler will not let me declare an __stdcall__ 
> pointer to function member and code will than SEGFAULT on invocation 
> of the member pointer.  This is not the case for Regular pointers to 
> functions. ( The compiler will also issue a warning  on mismatch.)
>
> Listing of the Error: (BAD)
>
> class AFoo
> {
> public:
>    __attribute__((__stdcall__))
>    void foo(int i ,int ii ,int iii) ;
> } ;
>
> __attribute__((__stdcall__))
> void AFoo::foo(int i ,int ii ,int iii)
> {
>    return ;
> }
>
> int main()
> {
>  AFoo afoo ;
>  void ( AFoo::*func)(int,int,int) ;
>  func = &AFoo::foo ;
>
>  for(int i=0 ; i < 0x8000000 ;i++)
>     (afoo.*func)(1,2,3) ; // SEGFAULT or SEGIL when stack is Exhausted
>  return 0 ;
> }
>
> any attempt  to place the __atribute__((stdcall)) in the pointer 
> declaration causes a compilation error. With out it the code will 
> SEGFAULT.
>
> If declaring a regular pointer to function than no compilation error 
> is issued  and all is well.
>
> Listing of Regular function pointer: (GOOD)
>
> void __attribute__((stdcall)) foo(int i ,int ii ,int iii)
> {
> }
>
> int main()
> {
>  void ( __attribute__((stdcall)) *func)(int,int,int) = &foo ;
>
>  for(int i=0 ; i < 0x8000000 ;i++)
>     (func)(1,2,3) ;
>
>  return 0 ;
> }
>
> removing the __attribute__((stdcall)) from the *func declaration will 
> rightfully issue a warning ( should be an error if you ask me, type 
> mismatch).
> But Not so on our first example.
>
> !!!!!!!!!!!!!!!!!!
> Please if any body can help me? This totaly breaks COM. Is there a GCC 
> switch to have all members (and pointers)__stdcall, to by pass this 
> problem?
>
> Free Life
> Boaz
>
>
>
>
>





More information about the wine-devel mailing list