Subject: Re: port-xen/29887: sysctl kern.consdev coredumps
To: None <port-xen-maintainer@netbsd.org, gnats-admin@netbsd.org,>
From: Alan Barrett <apb@cequrux.com>
List: netbsd-bugs
Date: 06/20/2005 10:04:13
The following reply was made to PR port-xen/29887; it has been noted by GNATS.
From: Alan Barrett <apb@cequrux.com>
To: gnats-bugs@NetBSD.org, netbsd-bugs@NetBSD.org,
tech-userlevel@NetBSD.org
Cc:
Subject: Re: port-xen/29887: sysctl kern.consdev coredumps
Date: Mon, 20 Jun 2005 12:03:49 +0200
On Fri, 17 Jun 2005, Christos Zoulas wrote:
> I don't think so either, but when you ask the compiler to call printf(),
> and it calls puts() because it `knows' it is better, what else are you
> left with?
In my opinion, the compiler should decide whether or not it is
allowed to convert printf("%s",foo) to puts(foo) [and similarly with
fprintf/fputs] depending on what standards you told the compiler that
the code was intended to conform to.
For example, if you tell the compiler that the code conforms to the
hosted environment defined in ANSI/ISO 9899:1989, then the compiler
can know that printf("%s",NULL) invokes undefined behaviour, and the
programmer shouldn't care whether the undefined behaviour results in a
core dump or in the string "(null)" being printed.
I suggest the following actions:
1. Accept the fact that programs that expect printf("%s", NULL)
to print "(null)" are relying on a particular historical
interpretation of behaviour that is undefined by recent standards.
2. As a temporary hack, change gcc to never perform the printf/puts
conversion that is causing trouble for the programs identified in
(1). Alternatively, change gcc to perform the conversion only if
it can prove to itself that the string will not be null.
3. Fix gcc to make it perform or not perform the printf/puts
conversion depending on what combination of "-std=<standard>",
"-ansi", "-pedantic", "-ffreestanding" and similar options were
specified. Possibly also add a "-fno-convert-printf-to-puts" or
similar option.
4. Make the programs identified in (1) pass appropriate flags to the
compiler fixed in (2) so that they do get the historical "(null)"
behaviour.
5. Once (4) has been done, the temporary hack in (2) can be removed.
6. In the long term, change the programs identified in (1) so that
they do not attempt to invoke undefined behaviour from printf.
--apb (Alan Barrett)