| 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. |