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!