how to fool gcc?
Tim Kientzle
kientzle at acm.org
Tue Feb 10 08:11:27 PST 2004
Suggestions:
1) Convert RETURNS(s) into a function rather than a macro.
2) Use a ternary (someone else suggested this)
3) Remove the printf-like declaration (Yes, this is distasteful.)
4) Add an intermediate variable:
do {
const char *_t = (s) == NULL ? "NULL" : (s);
openpam_log(... , _t);
return (s);
} while (0)
That's all I can think of right now, though I'm certain there
are numerous other fixes.
Good luck, (let us know what works!)
Tim
Dag-Erling Smørgrav wrote:
> I'm having trouble with some uncommitted OpenPAM patches that I'd like
> to get into the tree. The problem actually doesn't occur with a
> normal build, but it prevents me from building a debugging version of
> libpam.
>
> Part of the patch declares openpam_log(3) as printf-like so gcc can
> check format strings etc. However, openpam_log(3) is also used in
> debugging macros such as this:
>
> #define RETURNS(s) do { \
> if ((s) == NULL) \
> openpam_log(PAM_LOG_DEBUG, "returning NULL"); \
> else \
> openpam_log(PAM_LOG_DEBUG, "returning '%s'", (s)); \
> return (s); \
> } while (0)
>
> The problem is that when it encounters RETURNS(NULL), gcc complains
> that I'm passing a NULL argument to printf(3), even though it should
> be obvious that I'm not:
>
> cc -O -pipe -march=pentium2 -I/usr/src/lib/libpam/libpam -I/home/des/projects/openpam/include -DLIB_MAJ=2 -g -DDEBUG -Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wbad-function-cast -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -c /home/des/projects/openpam/lib/openpam_get_option.c
> /home/des/projects/openpam/lib/openpam_get_option.c: In function `openpam_get_option':
> /home/des/projects/openpam/lib/openpam_get_option.c:62: warning: reading through null pointer (arg 4)
> /home/des/projects/openpam/lib/openpam_get_option.c:73: warning: reading through null pointer (arg 4)
> *** Error code 1
>
> Stop in /usr/src/lib/libpam/libpam.
>
> I've tried various twists to fool gcc, such as casting (s) to (const
> char *) and adding 0 to it hoping that the addition would defeat its
> NULL pointer check. Nothing I've tried works, though, and I would
> really hate to have to lower the WANRS level just for this.
>
> Any suggestions?
>
> DES
More information about the freebsd-hackers
mailing list