Date: Tue, 10 Feb 2004 08:11:20 -0800 From: Tim Kientzle <kientzle@acm.org> To: =?ISO-8859-1?Q?Dag-Erling_Sm=F8rgrav?= <des@des.no> Cc: hackers@freebsd.org Subject: Re: how to fool gcc? Message-ID: <402902A8.8040005@acm.org> In-Reply-To: <xzpad3r5mj4.fsf@dwp.des.no> References: <xzpad3r5mj4.fsf@dwp.des.no>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?402902A8.8040005>