proposal: warning for incomplete multichars

Steve White stevan.white@googlemail.com
Mon Oct 3 14:02:00 GMT 2011


Hi!

This concerns multiple character integer constants, e.g.
	'abcd'
as discussed in the C99 standard in subsection 6.4.4.4.
We'll call them "multichars".

First:  everybody agrees multichars are non-portable and therefore to
be avoided.
That said, there are real-life situations where they are very natural.
 People use them, portability notwithstanding.

Presently cpp has options to turn all multichar warnings on, or all
off.  Furthermore, it properly warns of multichars that are too big
for the int type.  This is good.

An edge case is that of *incomplete* multichars, such as
	'abc'
While gcc arranges for this to equal '\0abc' as one might expect (and
as in many applications is assumed); other compilers do not.  The C99
standard is silent on the point.
(Note this behavior is independent of endian-ness.)

The primary issue with complete multichars is that of endian-ness, but
that can be handled in various programmatic ways.
Incomplete multichars by contrast are impossible to detect
programmatically and are non-portable even between compilers on the
same architecture.  Furthermore, in many applications, a multichar
with other than four characters is always a typo.

What is meant by an incomplete multichar depends: on a 64-bit
architecture, an int isn't completely specified by four characters
(without a specification of padding and endian-ness). Also, there are
applications too where two-character multichars are always intended.

I propose therefore a default warning of an incomplete multichar, to
compliment the existing option -Wno-multichar, to be turned on by an
option something like
	-Wmultichar-besides=<n>
where <n> is 2, 4, or 8, which would turn on warnings for any
multichar of length besides <n> bytes.


Cheers!



More information about the Gcc mailing list