Why does casting a function generate a run-time abort?
Ziemowit Laski
zlaski@apple.com
Fri Jun 18 02:19:00 GMT 2004
On 17 Jun, 2004, at 19.08, Mark Mitchell wrote:
> Ziemowit Laski wrote:
>
>> Compiling the following snippet
>> typedef struct objc_Object * foo_id ;
>> typedef struct blortstruct *blort ;
>> extern foo_id objc_msgSend(foo_id, ...);
>> int main(int argc, char * argv[])
>> {
>> blort foo = 0, bar = 0 ;
>> foo_id obj0;
>> obj0 = ((foo_id ((*)(foo_id, char *, blort, blort)))
>> &objc_msgSend) (obj0, "foo message", foo, bar);
>> return 0;
>> }
>> on the current TOT produces the following messages:
>> R3692996.c: In function `main':
>> R3692996.c:9: warning: function called through a non-compatible type
>> R3692996.c:9: note: if this code is reached, the program will abort
>> Could someone shed some light on this?
>
> In general, this code is unsafe.
Yes, it certainly _can_ be, but it's up to the user to ensure that the
ABI gods are satisfied. After all, C is not a high-level,
strongly-typed language... :-)
But, like I said, I only really care about my ObjC messaging casts
getting through, while at the same time not causing havoc in the
middle- and back-ends. :-)
--Zem
--------------------------------------------------------------
Ziemowit Laski 1 Infinite Loop, MS 301-2K
Mac OS X Compiler Group Cupertino, CA USA 95014-2083
Apple Computer, Inc. +1.408.974.6229 Fax .5477
More information about the Gcc
mailing list