>Synopsis: /usr/include/sys/param.h breaks code
>Category: system
>Environment:
System : OpenBSD 5.0
Details : OpenBSD 5.0-stable (GENERIC.MP) #0: Thu Feb 16 01:38:28
EST 2012
[email protected]:/usr/src/sys/arch/i386/compile/GENERIC.MP
Architecture: OpenBSD.i386
Machine : i386
>Description:
/usr/include/sys/param.h contains a "convenience macro" named
nitems, which causes user code using nitems in an innocent
context to fail mysteriously. The bug was spotted during
compilation of c++ code that uses the FLTK port.
The macro is named "nitems" and is found in /usr/include/sys/param.h
at line 196:
191 /* Macros for calculating the offset of a field */
192 #if !defined(offsetof) && defined(_KERNEL)
193 #define offsetof(s, e) ((size_t)&((s *)0)->e)
194 #endif
195
196 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
197
>How-To-Repeat:
it was found in a c++ method, I imagine you can write
sample code to exercise the bug.
Any use of nitems(...) that one does not want expanded
as per the macro will demonstrate the bug.
snippet that ought to bug:
#include <sys/param.h>
extern int nitems(void);
/* expands to extern int (sizeof((void))/sizeof((void)[0]); */
.... later ....
foo = nitems();
/* expands to foo = (sizeof(())/sizeof(()[0]); */
>Fix:
surround the nitems macro with #if define(_KERNEL) and
let any non-kernel code that has come to depend on it
choke.
No dmesg needed.
Sent this to gnats... no response. Gnats check-your-PR webpage doesn't
work.
Sent to bugs@, not subscribed, please CC if there is some argument.
Dave