[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
RE: nonstandard assumptions in the code
Howard Chu writes:
>>>> * can cast function pointers to 'void *' and back
>>>> (at least the threading stuff)
>
> K&R 2nd Edition (ANSI C) p.120 "Any pointer can be cast to void * and back
> again without loss of information."
This does not apply to function pointers. There have been plenty of
threads about this on comp.std.c and comp.lang.c. Some cite real-world
examples.
Formal reason: ANSI 3.2.2.3 says 'A pointer to any INCOMPLETE OR OBJECT
TYPE may be converted to a pointer to void and back again; the result
shall compare equal to the original pointer.'
However, a function is not an object.
>> Another non-ANSI thing: LBER_OPT_ON and LDAP_OPT_ON are #defined as
>> ((void*)1). There is no guarantee that this is != NULL (the *_OPT_OFF
>> options). I'll install this fix unless someone protests:
>
> K&R 2nd Edition p.102 - NULL is zero, by definition. Also stated again
> in section 6.2.2.3 of the C90 spec.
Not quite. NULL is a null pointer constant, and a null pointer constant
is _spelled_ 0 or (void*)0. But that doesn't mean that some other
integer cast to void* can't compare equal to NULL. The result of
casting integers (other than the constant 0) to pointers is
implementation-defined.
--
Hallvard