(linenum→info "unix/slp.c:2238")

glibc/2.7/CONFORMANCE

    1: Conformance of the GNU libc with various standards
    2: ==================================================
    3: 
    4: The GNU libc is designed to be conformant with existing standard as
    5: far as possible.  To ensure this I've run various tests.  The results
    6: are presented here.
    7: 
    8: 
    9: Open Group's hdrchk
   10: ===================
   11: 
   12: The hdrchk test suite is available from the Open Group at
   13: 
   14:         ftp://ftp.rdg.opengroup.org/pub/unsupported/stdtools/hdrchk/
   15: 
   16: I've last run the suite on 2004-04-17 on a Linux/x86 system running
   17: a Fedora Core 2 test 2 + updates with the following results [*]:
   18: 
   19:         FIPS           No reported problems
   20: 
   21:         POSIX90                No reported problems
   22: 
   23:         XPG3           Prototypes are now in the correct header file
   24: 
   25: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   26: *** Starting unistd.h
   27: Missing: extern char *  cuserid();
   28: Missing: extern int     rename();
   29: *** Completed unistd.h
   30: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   31: 
   32:         XPG4           Prototype is now in the correct header file
   33:                         and the _POSIX2_C_VERSION symbol has been removed
   34: 
   35: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   36: *** Starting unistd.h
   37: Missing: extern char *  cuserid();
   38: Missing: #define        _POSIX2_C_VERSION       (-1L)
   39: *** Completed unistd.h
   40: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   41: 
   42:         POSIX96                Prototype moved
   43:                         (using "base realtime threads" subsets)
   44: 
   45: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   46: *** Starting unistd.h
   47: Missing: extern int     pthread_atfork();
   48: *** Completed unistd.h
   49: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   50: 
   51:         UNIX98         Prototypes moved and _POSIX2_C_VERSION removed
   52:                         (using "base realtime threads mse lfs" subset)
   53: 
   54: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   55: *** Starting unistd.h
   56: Missing: extern char *  cuserid();
   57: Missing: #define        _POSIX2_C_VERSION       (-1L)
   58: Missing: extern int     pthread_atfork();
   59: *** Completed unistd.h
   60: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   61: 
   62: 
   63: That means all the reported issues are due to the headers having been
   64: cleaned up for recent POSIX/Unix specification versions.  Duplicated
   65: prototypes have been removed and obsolete symbols have been removed.
   66: Which means that as far as the tests performed by the script go, the
   67: headers files comply to the current POSIX/Unix specification.
   68: 
   69: 
   70: [*] Since the scripts are not clever enough for the way gcc handles
   71: include files (namely, putting some of them in gcc-local directory) I
   72: copied over the iso646.h, float.h, and stddef.h headers and ignored the
   73: problems resulting from the split limits.h file).
   74: 
   75: 
   76: Technical C standards conformance issues in glibc
   77: =================================================
   78: 
   79: If you compile programs against glibc with __STRICT_ANSI__ defined
   80: (as, for example, by gcc -ansi, gcc -std=c89, gcc -std=iso1990:199409
   81: or gcc -std=c99), and use only the headers specified by the version of
   82: the C standard chosen, glibc will attempt to conform to that version
   83: of the C standard (as indicated by __STDC_VERSION__):
   84: 
   85: GCC options             Standard version
   86: -ansi                   ISO/IEC 9899:1990
   87: -std=c89                ISO/IEC 9899:1990
   88: -std=iso9899:199409     ISO/IEC 9899:1990 as amended by Amd.1:1995
   89: -std=c99                ISO/IEC 9899:1999
   90: 
   91: (Note that -std=c99 is not available in GCC 2.95.2, and that no
   92: version of GCC presently existing implements the full C99 standard.)
   93: 
   94: You may then define additional feature test macros to enable the
   95: features from other standards, and use the headers defined in those
   96: standards (for example, defining _POSIX_C_SOURCE to be 199506L to
   97: enable features from ISO/IEC 9945-1:1996).
   98: 
   99: There are some technical ways in which glibc is known not to conform
  100: to the supported versions of the C standard, as detailed below.  Some
  101: of these relate to defects in the standard that are expected to be
  102: fixed, or to compiler limitations.
  103: 
  104: 
  105: Defects in the C99 standard
  106: ===========================
  107: 
  108: Some defects in C99 were corrected in Technical Corrigendum 1 to that
  109: standard.  glibc follows the corrected specification.
  110: 
  111: 
  112: Implementation of library functions
  113: ===================================
  114: 
  115: The implementation of some library functions does not fully follow the
  116: standard specification:
  117: 
  118: C99 added additional forms of floating point constants (hexadecimal
  119: constants, NaNs and infinities) to be recognised by strtod() and
  120: scanf().  The effect is to change the behavior of some strictly
  121: conforming C90 programs; glibc implements the C99 versions only
  122: irrespective of the standard version selected.
  123: 
  124: C99 added %a as another scanf format specifier for floating point
  125: values.  This conflicts with the glibc extension where %as, %a[ and
  126: %aS mean to allocate the string for the data read.  A strictly
  127: conforming C99 program using %as, %a[ or %aS in a scanf format string
  128: will misbehave under glibc.
  129: 
  130: 
  131: Compiler limitations
  132: ====================
  133: 
  134: The macros __STDC_IEC_559__, __STDC_IEC_559_COMPLEX__ and
  135: __STDC_ISO_10646__ are properly supposed to be defined by the
  136: compiler, and to be constant throughout the translation unit (before
  137: and after any library headers are included).  However, they mainly
  138: relate to library features, and the necessary magic has yet to be
  139: implemented for GCC to predefine them to the correct values for the
  140: library in use, so glibc defines them in <features.h>.  Programs that
  141: test them before including any standard headers may misbehave.
  142: 
  143: GCC doesn't support the optional imaginary types.  Nor does it
  144: understand the keyword _Complex before GCC 3.0.  This has the
  145: corresponding impact on the relevant headers.
  146: 
  147: glibc's use of extern inline conflicts with C99: in C99, extern inline
  148: means that an external definition is generated as well as possibly an
  149: inline definition, but in GCC it means that no external definition is
  150: generated.  When GCC's C99 mode implements C99 inline semantics, this
  151: will break the uses of extern inline in glibc's headers.  (Actually,
  152: glibc uses `extern __inline', which is beyond the scope of the
  153: standard, but it would clearly be very confusing for `__inline' and
  154: plain `inline' to have different meanings in C99 mode.)
  155: 
  156: glibc's <tgmath.h> implementation is arcane but thought to work
  157: correctly; a clean and comprehensible version requires compiler
  158: builtins.
  159: 
  160: For most of the headers required of freestanding implementations,
  161: glibc relies on GCC to provide correct versions.  (At present, glibc
  162: provides <stdint.h>, and GCC doesn't.)
  163: 
  164: Implementing MATH_ERRNO, MATH_ERREXCEPT and math_errhandling in
  165: <math.h> needs compiler support: see
  166: 
  167: http://sources.redhat.com/ml/libc-hacker/2000-06/msg00008.html
  168: http://sources.redhat.com/ml/libc-hacker/2000-06/msg00014.html
  169: http://sources.redhat.com/ml/libc-hacker/2000-06/msg00015.html
  170: 
  171: 
  172: Issues with headers
  173: ===================
  174: 
  175: None known.
Syntax (Markdown)