On Sun, 14 Mar 2010, Alexander Best wrote:

Description:
gcc complaints about the use of exit() in assert.c:

/usr/src/lib/libstand/assert.c:43: warning: implicit declaration of function
'exit'

It's not clear where this should be declared, or even it must exist.
exit() might be supplied by the application, but if not then it doesn't
exist and it is invalid for assert() to call it.  libstand(3) of course
doesn't document either exit() or the need to supply it to support
assert().

the attached patch replaces exit() (which is used illegally anyway, because no 
integer argument is being supplied) with abort().

The use might be legal, since libstand is freestanding so its exit might be
unrelated to the Standard C exit. However, most or all implementations of exit() in /sys/boot take an arg.

assert.c uses stand.h which conflicts with stdlib.h. so this patch also defines 
abort() in stand.h being an external function.

abort() certainly is not required to exist, and in fact doesn't exist for
any application in /sys/boot, so this change would mainly break most boot
code at link time.

libstand is independent of libc, so it is a bug for anything in it or
any application that uses it to include <stdlib.h>.  In libstand and
/sys/boot, this bug seems to be present only in ficl (the include is
ifdefed in only some places in ficl but in all places in libstand).

A nearby function that doesn't exist is atexit().  This is only
called from ifdefed out code in zalloc_malloc.c.


cheers.
alex
How-To-Repeat:
cd /usr/src/lib/libstand && make
Fix:


Patch attached with submission follows:

Index: lib/libstand/assert.c
===================================================================
--- lib/libstand/assert.c       (revision 205121)
+++ lib/libstand/assert.c       (working copy)
@@ -40,5 +40,5 @@
        else
                printf("Assertion failed: (%s), function %s, file %s, line "
                    "%d.\n", expression, func, file, line);

It would be nice to fix the style bug in this (use of C90 string
concatenation to obfuscate the message).  This style bug os missing in
the libc version.

-       exit();
+       abort();
}
Index: lib/libstand/stand.h
===================================================================
--- lib/libstand/stand.h        (revision 205121)
+++ lib/libstand/stand.h        (working copy)
@@ -265,6 +265,7 @@
extern char     *optarg;                        /* getopt(3) external variables 
*/
extern int      optind, opterr, optopt, optreset;
extern int      getopt(int, char * const [], const char *);
+extern void    abort(void);

Further unsorting of the declarations.

Note that exit() is of a different nature than getopt() -- it is
supplied by the application (if it exists), while getopt() is supplied
by libstand.  So there should be a separate section to declare exit() and
any other function that must be supplied by the application.


/* pager.c */
extern void     pager_open(void);

ISTR that there were once similar problems declaring main().  When it
wasn't declared explicitly, gcc -Wmumble used to warn about this.  So
someone "fixed" this by declaring it in a standard header.  But it
cannot be declared in a standard header since it has more than one
valid parameter list ((void), and the usual (argc, argv), and maybe
more).

Bruce
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to