Need info on "Safe C library"

Discussion in 'C Programming' started by Erwin Lindemann, Jan 30, 2008.

  1. Hi group!

    I hope this subject is topical here; if not, I apologize
    in advance. Context is, some days ago, in
    acticle <>, somebody posted
    a supposedly portable program here. Later, another poster
    noticed it didn't compile with one particular compiler, and
    it was suggested to report the problem in another group where
    said compiler is topical. Well, out of interest what the problem
    might be I did just that, and received the following 3-line
    response:

    ----snip----
    1) Read the error message.
    2) Read the documentation about the safe C library
    3) Use another compiler. As I told you in comp.lang.c gcc is the best
    ----snip----

    The error message is
    ----snip----
    lc -ansic -A -O -c ronu.c -o ronu.obj
    Error ronu.c: 62 redefinition of 'ConstraintFailed'
    Error c:\lcc\include\safelib.h: 3 Previous definition of 'ConstraintFailed' here
    Warning ronu.c: 62 inconsistent linkage for 'ConstraintFailed' previously declared at c:\lcc\include\safelib.h 3
    2 errors, 1 warning
    1 error
    ----snip----

    Obviously, the code in question uses the identifier
    "ContraintFailed", which is already declared/defined(?) in
    "safelib.h" (which seems to be included by one of the standard
    headers). That part was easy.

    Now on to (2). What is "the safe C library" and where can I find
    information about it. Is it related to N1135?

    Chapter 6 in N1135 mentions 2 macros,

    __STDC_LIB_EXT1__
    The integer constant 200509L, intended to indicate
    conformance to this technical report.
    (the compiler in question defines __STDC_LIB_EXT1__ empty)

    __STDC_WANT_LIB_EXT1__
    * Functions, macros, and types declared or defined in N1135
    are unavailable if __STDC_WANT_LIB_EXT1__ is defined as a
    macro that expands to the integer constant 0.
    * Functions, macros, and types declared or defined in N1135
    are available if __STDC_WANT_LIB_EXT1__ is defined as a
    macro that expands to the integer constant 1 (or other values
    as explained in footnote (2)).
    * if __STDC_WANT_LIB_EXT1__ is undefined, things are
    implementation-defined.
    (the compiler in question does not define __STDC_WANT_LIB_EXT1__ itself)

    After reading all this, I'm still very confused. What is the correct
    way to compile conforming programs with the "safe C library"?

    I tried

    #define __STDC_WANT_LIB_EXT1__ 0

    at the top of the source file; still the same error.

    Is there a different document that does reserve "ConstraintFailed"
    from usage in the programmer's name space?

    Thanks
    --
    Erwin Lindemann
     
    Erwin Lindemann, Jan 30, 2008
    #1
    1. Advertising

  2. Erwin Lindemann <> writes:
    > I hope this subject is topical here; if not, I apologize
    > in advance. Context is, some days ago, in
    > acticle <>, somebody posted
    > a supposedly portable program here. Later, another poster
    > noticed it didn't compile with one particular compiler, and
    > it was suggested to report the problem in another group where
    > said compiler is topical. Well, out of interest what the problem
    > might be I did just that, and received the following 3-line
    > response:
    >
    > ----snip----
    > 1) Read the error message.
    > 2) Read the documentation about the safe C library
    > 3) Use another compiler. As I told you in comp.lang.c gcc is the best
    > ----snip----
    >
    > The error message is
    > ----snip----
    > lc -ansic -A -O -c ronu.c -o ronu.obj
    > Error ronu.c: 62 redefinition of 'ConstraintFailed'
    > Error c:\lcc\include\safelib.h: 3 Previous definition of 'ConstraintFailed' here
    > Warning ronu.c: 62 inconsistent linkage for 'ConstraintFailed' previously declared at c:\lcc\include\safelib.h 3
    > 2 errors, 1 warning
    > 1 error
    > ----snip----
    >
    > Obviously, the code in question uses the identifier
    > "ContraintFailed", which is already declared/defined(?) in
    > "safelib.h" (which seems to be included by one of the standard
    > headers). That part was easy.


    Just to make this easier to talk about, the compiler in question is
    apparently lcc-win; the quoted response ("Use another compiler") was
    posted to comp.compilers.lcc by jacob navia himself, the maintainer of
    lcc-win.

    All we can really tell you here is that the C standard does not allow
    a conforming implementation to define the identifier ConstraintFailed
    in a standard header; it *must* allow a user program to use that
    identifier itself. Whether lcc-win's use of this identifier is a
    minor bug or a major one is a question I won't try to address, but it
    is clearly a violation of the C standard (either C90 or C99).
    Compilers are allowed to provide extensions, but they are not allowed
    to infringe on the user's name space like this.

    > Now on to (2). What is "the safe C library" and where can I find
    > information about it. Is it related to N1135?


    It appears not to be related to N1135. I just downloaded that
    document; there is no mention of "safelib.h" or "ConstraintFailed".

    Perhaps it's something specific to lcc-win. I suggest consulting
    lcc-win's own documentation. Perhaps there's a way to disable it.

    [...]

    > After reading all this, I'm still very confused. What is the correct
    > way to compile conforming programs with the "safe C library"?
    >
    > I tried
    >
    > #define __STDC_WANT_LIB_EXT1__ 0
    >
    > at the top of the source file; still the same error.
    >
    > Is there a different document that does reserve "ConstraintFailed"
    > from usage in the programmer's name space?


    There certainly should be such a document, but I'm not aware of it.
    A Google search for "safelib" and "ConstraintFailed" turned up only
    references to this particular problem with lcc-win.

    You *could* change your identifier to avoid conflicting with the
    implementation's infringing use. You might have to study the
    implementation's documentation carefully to find out what other
    changes you'll have to make to avoid the implementation's non-standard
    quirks.

    I think that comp.compilers.lcc is still the best place to discuss
    this issue.

    --
    Keith Thompson (The_Other_Keith) <>
    Nokia
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Jan 30, 2008
    #2
    1. Advertising

  3. Erwin Lindemann

    Army1987 Guest

    Erwin Lindemann wrote:

    > Hi group!
    >
    > I hope this subject is topical here; if not, I apologize
    > in advance. Context is, some days ago, in
    > acticle <>, somebody posted
    > a supposedly portable program here. Later, another poster
    > noticed it didn't compile with one particular compiler, and
    > it was suggested to report the problem in another group where
    > said compiler is topical. Well, out of interest what the problem
    > might be I did just that, and received the following 3-line
    > response:
    >
    > ----snip----
    > 1) Read the error message.
    > 2) Read the documentation about the safe C library
    > 3) Use another compiler. As I told you in comp.lang.c gcc is the best
    > ----snip----
    >
    > The error message is
    > ----snip----
    > lc -ansic -A -O -c ronu.c -o ronu.obj
    > Error ronu.c: 62 redefinition of 'ConstraintFailed'
    > Error c:\lcc\include\safelib.h: 3 Previous definition of 'ConstraintFailed' here
    > Warning ronu.c: 62 inconsistent linkage for 'ConstraintFailed' previously declared at c:\lcc\include\safelib.h 3
    > 2 errors, 1 warning
    > 1 error
    > ----snip----
    >
    > Obviously, the code in question uses the identifier
    > "ContraintFailed", which is already declared/defined(?) in
    > "safelib.h" (which seems to be included by one of the standard
    > headers). That part was easy.

    [how do I fix that?]
    If for some reason you don't want to use another compiler, edit
    C:\lcc\include\stdlib.h and move the `#include "safelib.h"` line into the
    #ifndef __ANSIC__ONLY__ group. Then, while you're at it, move all other
    invasions of user's namespace into that group. In the process, you'll
    change your mind about wanting to stick with lcc-win if you care any
    little bit about portability.
    (And you'll be somewhat puzzled when you see
    #define RAND_MAX 0x7FFF
    [snip]
    #ifndef RAND_MAX
    #define RAND_MAX 0x7fff
    #endif
    in it.)
    --
    Army1987 (Replace "NOSPAM" with "email")
     
    Army1987, Jan 30, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Vasanth
    Replies:
    0
    Views:
    561
    Vasanth
    Jun 28, 2004
  2. Andrea Williams

    Clear the Render info & change to different info

    Andrea Williams, Oct 27, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    1,424
    Ken Dopierala Jr.
    Oct 27, 2004
  3. Kiran
    Replies:
    0
    Views:
    1,228
    Kiran
    Feb 6, 2005
  4. ilya

    get CPU info, RAM info

    ilya, Apr 8, 2010, in forum: Java
    Replies:
    43
    Views:
    6,017
    Mike Schilling
    Apr 19, 2010
  5. Kenshin
    Replies:
    1
    Views:
    226
    Jeff Cochran
    Jun 25, 2004
Loading...

Share This Page