Beware of subtle bugs due to cpp(1) limitations!

Ruslan Ermilov ru at
Sat Dec 3 14:45:49 PST 2005

Hi there,

cpp(1) only supports integer expressions, so the following

#define	FOO	foo
#if FOO == bar

will always evaluate to true, because "foo" and "bar" will
be treated as zeroes, as explained in

I've only scanned for _MACHINE_ARCH, because that's how I
discovered it, and there's a couple of places where the
code is broken:

sys/dev/isp/isp_freebsd.h:#if   _MACHINE_ARCH == sparc64
sys/dev/ispfw/ispfw.c:#if       _MACHINE_ARCH == sparc64
sys/dev/ispfw/ispfw.c:#if       _MACHINE_ARCH == sparc64
sys/dev/ispfw/ispfw.c:#if       _MACHINE_ARCH == sparc64
sys/gnu/fs/reiserfs/reiserfs_fs.h:#if (_MACHINE_ARCH == amd64)
sys/netgraph/ng_vjc.c:#if _MACHINE_ARCH == i386
sys/netgraph/ng_vjc.c:#elif _MACHINE_ARCH == alpha
sys/netgraph/ng_vjc.c:#error Unspported _MACHINE_ARCH

In these cases, the right tests would be #ifdef __sparc64__.
Other instances (of not _MACHINE_ARCH) may be harder to
fix.  The ng_vjc.c is a nice example that clearly
demonstrates (without compiling the code) that it's
broken -- it's compiled on all architectures, but has
the following code:

#if _MACHINE_ARCH == i386
#define NG_VJC_TSTATE_PTR_TYPE  &ng_parse_uint32_type
#elif _MACHINE_ARCH == alpha
#define NG_VJC_TSTATE_PTR_TYPE  &ng_parse_uint64_type
#error Unspported _MACHINE_ARCH

The season for more bugs of this type is declared open!  :-)

Ruslan Ermilov
ru at
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url :

More information about the freebsd-current mailing list