Changes to Answers to Frequently Asked Questions (FAQ) on comp.lang.c

Steve Summit scs at adam.mit.edu
Wed Feb 6 18:01:48 AEST 1991


This article contains changes between the previous posting of the
frequently-asked questions list (posted January 1) and the new
one.  (Do _not_ worry if you have not seen the new one yet; it's
coming up next.)

(These diffs have been edited for readability and are not suitable
for the patch program.)

By the way, sorry for the delay in this month's FAQ postings:
I was busy traveling and getting engaged.

==========
< [Last modified December 16, 1990 by scs.]
---
> [Last modified February 5, 1990 by scs.]
==========
> 18. I came across some "joke" code containing the "expression"
>     5["abcdef"] .  How can this be legal C?
>
> A:  Yes, Virginia, array subscripting is commutative in C.  This curious
>     fact follows from the pointer definition of array subscripting,
>     namely that a[e] is exactly equivalent to *((a)+(e)), for _any_
>     expression e and primary expression a, as long as one of them is a
>     pointer expression.  This unsuspected commutativity is often
>     mentioned in C texts as if it were something to be proud of, but it
>     finds no useful application outside of the Obfuscated C Contest (see
>     also question 83).
==========
<     The Standard has also been adopted as ISO/IEC 9899:1990, although
<     the Rationale is currently not included.
---
>     The Standard has also been adopted as an international standard,
>     ISO/IEC 9899:1990, although the Rationale is currently not included.
==========
> Section 7. Lint
>
> 39. I just typed in this program, and it's acting strangely.  Can you
>     see anything wrong with it?
>
> A:  Try running lint first.  Most C compilers are really only half-
>     compilers, electing not to diagnose numerous source code
>     difficulties which would not actively preclude code generation.
>     That the "other half," better error detection, was deferred to lint,
>     was a fairly deliberate decision on the part of the earliest Unix C
>     compiler authors, but is inexcusable (in the absence of a supplied,
>     consistent lint) in a modern compiler.
>
> 40. How can I shut off the "warning: possible pointer alignment problem"
>     message lint gives me for each call to malloc?
>
> A:  The problem is that traditional versions of lint do not know, and
>     cannot be told, that malloc "returns a pointer to space suitably
>     aligned for storage of any type of object."  It is possible to
>     provide a pseudoimplementation of malloc, using a #define inside of
>     #ifdef lint, which effectively shuts this warning off, but a
>     simpleminded #definition will also suppress meaningful messages
>     about truly incorrect invocations.  It may be easier simply to
>     ignore the message, perhaps in an automated way with grep -v.
>
> 41. Where can I get an ANSI-compatible lint?
>
> A:  A product called FlexeLint is available (in "shrouded source form,"
>     for compilation on 'most any system) from
>
>          Gimpel Software
>          3207 Hogarth Lane
>          Collegeville, PA  19426  USA
>          (+1) 215 584 4261
>
>     Another product is MKS lint, from Mortice Kern Systems.  At the
>     moment, I don't have their address, but you can send email to
>     inquiry at mks.com .
>
> 42. Don't ANSI function prototypes render lint obsolete?
>
> A:  No.  First of all, prototypes work well only if the programmer works
>     assiduously to maintain them, and the effort to do so (plus the
>     extra recompilations required by numerous, more-frequently-modified
>     header files) can rival the toil of keeping function calls correct
>     manually.  Secondly, an independent program like lint will probably
>     always be more scrupulous at enforcing compatible, portable coding
>     practices than will a particular, implementation-specific, feature-
>     and extension-laden compiler.  (Some vendors seem to introduce
>     incompatible extensions deliberately, perhaps to lock in market
>     share.)
==========
      alloca cannot be written portably, and is difficult to implement on
      machines without a stack.  Its use is problematical (and the obvious
      implementation on a stack-based machine fails) when its return value
      is passed directly to another function, as in
<     fgets(alloca(100), stdin, 100).
---
>     fgets(alloca(100), 100, stdin).
==========
  A:  This trick is popular, although Dennis Ritchie has called it
<     "unwarranted chumminess with the compiler."  It is surprisingly
<     difficult to determine whether the ANSI C standard allows or
<     disallows it, but it is hard to imagine a compiler or architecture
<     for which it wouldn't work.  (Debugging, array-bounds-checking
<     compilers might issue warnings.)
---
>     "unwarranted chumminess with the compiler."  The ANSI C standard
>     allows it only implicitly.  It seems to be portable to all known
>     implementations.  (Debugging, array-bounds-checking compilers might
>     issue warnings.)
==========
      of curses have a nodelay() function.  Depending on your system, you
      may also be able to use "nonblocking I/O", or a system call named
<     "select", or the FIONREAD ioctl, or the O_NDELAY option to open() or
<     fcntl(), or a kbhit() routine.
---
>     "select", or the FIONREAD ioctl, or kbhit(), or rdchk(), or the
>     O_NDELAY option to open() or fcntl().
==========
< A:  BSD systems provide ftruncate(), and some PC compilers supply
<     chsize(), but there is no portable solution.
---
> A:  BSD systems provide ftruncate(), and several others supply chsize(),
>     but there is no truly portable solution.
==========
> 73. How can I recover the file name given an open file descriptor?
>
> A:  This problem is, in general, insoluble.  Under Unix, for instance, a
>     scan of the entire disk, (perhaps requiring special permissions)
>     would be required, and would fail if the file descriptor were a pipe
>     (and could give a misleading answer for a file with multiple links).
>     It is best to remember the names of open files yourself (perhaps
>     with a wrapper function around fopen).
>
>
> Section 14. Style
>
> 74. Here's a neat trick:
>
>          if(!strcmp(s1, s2))
>
>     Is this good style?
>
> A:  No.  This is a classic example of C minimalism carried to an
>     obnoxious degree.  The test succeeds if the two strings are equal,
>     but its form strongly suggests that it tests for inequality.
>
> A much better solution is to use a macro:
>
>      #define Streq(s1, s2) (strcmp(s1, s2) == 0)
>
==========
  79. How can I write data files which can be read on other machines with
      different word size, byte order, or floating point formats?

  A:  The best solution is to use a text file (usually ASCII), written
<     with fprintf and read with fscanf or the like.  Be very skeptical of
<     arguments which imply that text files are too big, or that reading
<     and writing them is too slow.  Not only is their efficiency
<     frequently acceptable in practice, but the advantages of being able
<     to manipulate them with standard tools can be overwhelming.
---
>     with fprintf and read with fscanf or the like.  (Similar advice also
>     applies to network protocols.)  Be very skeptical of arguments which
>     imply that text files are too big, or that reading and writing them
>     is too slow.  Not only is their efficiency frequently acceptable in
>     practice, but the advantages of being able to manipulate them with
>     standard tools can be overwhelming.
>
>     If the binary format is being imposed on you by an existing program,
>     first see if you can get that program changed to use a more portable
>     format.
==========
                      Bellcore, and Carnegie Mellon.  To find about f2c,
                      send the mail message "send index from f2c" to
<                     netlib at research.att.com or research!netlib.
---
>                     netlib at research.att.com or research!netlib.  (It is
>                     also available via anonymous ftp on
>                     research.att.com, in directory dist/f2c.)
==========
> 83. Where can I get the winners of the old Obfuscated C Contests?  When
>     will the next contest be held?
>
> A:  Send mail to {pacbell,uunet,utzoo}!hoptoad!obfuscate .  The contest
>     is usually announced in March, with entries due in May.  Contest
>     announcements are posted in several obvious places.  The winning
>     entries are archived on uunet (see question 82).
==========
      Don't assume that floating-point results will be exact, and
      especially don't assume that floating-point values can be compared
<     for equality.  (Don't stick in random "fuzz factors," either.)
---
>     for equality.  (Don't throw haphazard "fuzz factors" in, either.)
==========
  Thanks to Sudheer Apte, Mark Brader, Joe Buehler, Raymond Chen,
> Christopher Calabrese, James Davies, Norm Diamond, Ray Dunn, Stephen M.
> Dunn, Bjorn Engsig, Doug Gwyn, Tony Hansen, Joe Harrington, Guy Harris,
> Karl Heuer, Blair Houghton, Kirk Johnson, Andrew Koenig, John Lauro,
> Christopher Lott, Tim McDaniel, Evan Manning, Mark Moraes, Francois
> Pinard, randall at virginia, Rich Salz, Chip Salzenberg, Paul Sand, Doug
> Schmidt, Patricia Shanahan, Joshua Simons, Henry Spencer, Erik Talvola,
> Clarke Thatcher, Chris Torek, Ed Vielmetti, and Freek Wiedijk, who have
> contributed, directly or indirectly, to this article.



More information about the Comp.lang.c mailing list