Conformance of the GNU libc with various standards
==================================================

The GNU libc is designed to be conformant with existing standard as
far as possible.  To ensure this I've run various tests.  The results
are presented here.


Open Group's hdrchk
===================

The hdrchk test suite is available from the Open Group at

	ftp://ftp.rdg.opengroup.org/pub/unsupported/stdtools/hdrchk/

I've last run the suite on 2004-04-17 on a Linux/x86 system running
a Fedora Core 2 test 2 + updates with the following results [*]:

	FIPS		No reported problems

	POSIX90		No reported problems

	XPG3		Prototypes are now in the correct header file

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*** Starting unistd.h
Missing: extern char *  cuserid();
Missing: extern int     rename();
*** Completed unistd.h
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	XPG4		Prototype is now in the correct header file
			and the _POSIX2_C_VERSION symbol has been removed

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*** Starting unistd.h
Missing: extern char *  cuserid();
Missing: #define        _POSIX2_C_VERSION       (-1L)
*** Completed unistd.h
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	POSIX96		Prototype moved
			(using "base realtime threads" subsets)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*** Starting unistd.h
Missing: extern int     pthread_atfork();
*** Completed unistd.h
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	UNIX98		Prototypes moved and _POSIX2_C_VERSION removed
			(using "base realtime threads mse lfs" subset)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*** Starting unistd.h
Missing: extern char *  cuserid();
Missing: #define        _POSIX2_C_VERSION       (-1L)
Missing: extern int     pthread_atfork();
*** Completed unistd.h
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


That means all the reported issues are due to the headers having been
cleaned up for recent POSIX/Unix specification versions.  Duplicated
prototypes have been removed and obsolete symbols have been removed.
Which means that as far as the tests performed by the script go, the
headers files comply to the current POSIX/Unix specification.


[*] Since the scripts are not clever enough for the way gcc handles
include files (namely, putting some of them in gcc-local directory) I
copied over the iso646.h, float.h, and stddef.h headers and ignored the
problems resulting from the split limits.h file).


Technical C standards conformance issues in glibc
=================================================

If you compile programs against glibc with __STRICT_ANSI__ defined
(as, for example, by gcc -ansi, gcc -std=c89, gcc -std=iso1990:199409
or gcc -std=c99), and use only the headers specified by the version of
the C standard chosen, glibc will attempt to conform to that version
of the C standard (as indicated by __STDC_VERSION__):

GCC options		Standard version
-ansi			ISO/IEC 9899:1990
-std=c89		ISO/IEC 9899:1990
-std=iso9899:199409	ISO/IEC 9899:1990 as amended by Amd.1:1995
-std=c99		ISO/IEC 9899:1999

(Note that -std=c99 is not available in GCC 2.95.2, and that no
version of GCC presently existing implements the full C99 standard.)

You may then define additional feature test macros to enable the
features from other standards, and use the headers defined in those
standards (for example, defining _POSIX_C_SOURCE to be 199506L to
enable features from ISO/IEC 9945-1:1996).

There are some technical ways in which glibc is known not to conform
to the supported versions of the C standard, as detailed below.  Some
of these relate to defects in the standard that are expected to be
fixed, or to compiler limitations.


Defects in the C99 standard
===========================

Some defects in C99 were corrected in Technical Corrigendum 1 to that
standard.  glibc follows the corrected specification.


Implementation of library functions
===================================

The implementation of some library functions does not fully follow the
standard specification:

C99 added additional forms of floating point constants (hexadecimal
constants, NaNs and infinities) to be recognised by strtod() and
scanf().  The effect is to change the behavior of some strictly
conforming C90 programs; glibc implements the C99 versions only
irrespective of the standard version selected.

C99 added %a as another scanf format specifier for floating point
values.  This conflicts with the glibc extension where %as, %a[ and
%aS mean to allocate the string for the data read.  A strictly
conforming C99 program using %as, %a[ or %aS in a scanf format string
will misbehave under glibc if it does not include <stdio.h> and
instead declares scanf itself; if it gets the declaration of scanf
from <stdio.h>, it will use a C99-conforming version.


Compiler limitations
====================

The macros __STDC_IEC_559__, __STDC_IEC_559_COMPLEX__ and
__STDC_ISO_10646__ are properly supposed to be defined by the
compiler, and to be constant throughout the translation unit (before
and after any library headers are included).  However, they mainly
relate to library features, and the necessary magic has yet to be
implemented for GCC to predefine them to the correct values for the
library in use, so glibc defines them in <features.h>.  Programs that
test them before including any standard headers may misbehave.

GCC doesn't support the optional imaginary types.  Nor does it
understand the keyword _Complex before GCC 3.0.  This has the
corresponding impact on the relevant headers.

glibc's <tgmath.h> implementation is arcane but thought to work
correctly; a clean and comprehensible version requires compiler
builtins.

For most of the headers required of freestanding implementations,
glibc relies on GCC to provide correct versions.  (At present, glibc
provides <stdint.h>, and GCC doesn't before version 4.5.)

The definition of math_errhandling conforms so long as no translation
unit using math_errhandling is compiled with -fno-math-errno,
-fno-trapping-math or options such as -ffast-math that imply these
options.  math_errhandling is only conditionally defined depending on
__FAST_MATH__; the compiler does not provide the information needed
for more exact definitions based on settings of -fno-math-errno and
-fno-trapping-math, possibly for only some source files in a program.


Issues with headers
===================

None known.
