cdecl is another tool that has been around since the days when Trumpet Winsock and SLIP were cutting edge (the README says 1996) which I just found a use for.
I find it handy for debugging things like
#include <stdio.h>
#include <setjmp.h>
jmp_buf j;
extern int* fun1(void);
extern int* fun2(void);
extern int* fun3(void);
int* foo(int *p);
int* foo (int *p)
{
p = fun1();
if (setjmp (j))
return p;
/* longjmp (j) may occur in fun3. */
p = fun3();
return p;
}
ianw@lime:/tmp$ gcc -g -c -O2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -g -O3 jmp.c
cc1: warnings being treated as errors
jmp.c: In function 'foo':
jmp.c:11: warning: argument 'p' might be clobbered by 'longjmp' or 'vfork'
I can never remember the correct volatile for this situation
ianw@lime:~$ cdecl cdecl> explain volatile int *p declare p as pointer to volatile int cdecl> explain int *volatile v declare p as volatile pointer to int
So clearly the second version is the one I want, since I need to indicate that the pointer value might change underneath us. Nifty!