[comp.lang.c] pointers to functions, dereferencing, first byte of func

bhoughto@pima.intel.com (Blair P. Houghton) (02/01/91)

In article <15020@smoke.brl.mil> gwyn@smoke.brl.mil (Doug Gwyn) writes:
>In article <1991Jan30.031315.9427@dgbt.doc.ca> don@dgbt.doc.ca (Donald McLachlan) writes:
>-char *c;
>-extern char func();
>-c = func;
>-what I had to do to get at the first byte of executable code was ...
>
>This seems to me to have nothing to do with Standard C...

Oh yes it does.  It has to do with violating portability,
misunderstanding the meaning of "pointer to function,"
and illegally assigning values between incompatible types.

Firstly, (char *) and (char *()) are vastly different
types.  There are no guarantees as to size and alignment
matching.  Assigning the value of a (char *()) to a (char *)
is as bad as assigning an (unsigned register long *)
to a (double).

Secondly, you cannot dereference a pointer to a function.
You can only assign it to other variables of compatible
type and use it to call a function.  When calling as
`(*fp)()', the `(*fp)' part is termed the "function
designator."[*]  It is not an lvalue and can therefore not
reference objects.  `fp' is less a pointer and more a proxy
for an anonymous identifier.

Finally, There's no responsibility on the part of the platform to
map the "pointer to function" to any dereferencible location.
(However, nothing prohibits giving definition to undefined
behavior, and a purposefully nonconforming program operating
with cloying compiler-chumminess might take advantage of it.)

[*] Function designator is defined in ANSI X3.159-1989,
sec. 3.2.2.1, "Lvalues and Function Designators."
See also:
           3.3.2.2, "Function Calls"
           3.3.3.2, "Address and Indirection Operators"
           3.1.2.6, "Compatible Type and Composite Type"

				--Blair
				  "So if you add pointers to the
				   two functions f() and g(),
				   do you get f(g()) or g(f())?"