[TUHS] /bin/true (was basic tools / Universal Unix)

Warner Losh imp at bsdimp.com
Wed Nov 29 03:56:52 AEST 2017


On Tue, Nov 28, 2017 at 9:21 AM, Nemo <cym224 at gmail.com> wrote:

> On 19 October 2017 at 10:52, Ron Natalie <ron at ronnatalie.com> wrote:
> > My favorite reduction to absurdity was /bin/true.   Someone decided we
> > needed shell commands for true and false.   Easy enough to add a script
> that
> > said "exit 0" or exit 1" as its only line.
> > Then someone realized that the "exit 0" in /bin true was superfluous, the
> > default return was 0.  /bin/true turned into an empty, yet executable,
> file.
> >
> > Then the lawyers got involved.    We got a version of a packaged UNIX (I
> > think it was Interactive Systems).    Every shell script got twelve
> lines of
> > copyright/license boilerplate.     Including /bin true.
> > The file had nothing but useless comment in it.
>
> A late comment:  I seem to recall this boilerplate in earlier Solaris
> but Solaris 10 has an executable.  So I looked at the OpenSolaris
> source out of curiosity and found this.
>
> [CDDL stuff here]
> /*
>  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
>  * Use is subject to license terms.
>  */
>
> #pragma ident   "%Z%%M% %I%     %E% SMI"
>
> #include <unistd.h>
>
> /*
>  * Exit with a zero value as quickly as possible.
>  */
>
> int
> main(void)
> {
>         _exit(0);
>         /*NOTREACHED*/
>         return (0);
> }
>

Ah, the tyranny of  static analysis tools... _exit(0) should be marked such
that the tools know it does not return. This means the /*NOTREACHED*/ isn't
needed. And since there's no real exit path out of  main, the return (0) is
equally bogus (because main can't return). Yet lint and other tools have
ushered in this insanity.

I'm glad to see these days that these sorts of lame false positives have
been eliminated...

Then again _exit(0) is a useless optimization. It saves three closes for
files that are bound to be closed at image tear down. If it really is that
important (absent data, my gut tells me it isn't), then this should be
written in assembler. FreeBSD/amd64 would be something like:

#include <sys/syscall.h>
#include <machine/asm.h>

ENTRY(_start)
xor %r10, %r10
mov $SYS_exit, %eax
syscall
END(_start)

This some small hacks to each arch's SYS.h in libc, this could even be
smaller and MI :). this is tiny:
-rwxrwxr-x  1 imp  imp  672 Nov 28 10:18 true
  text   data   bss   dec   hex   filename
    10      0     0    10   0xa   true

Contrast that with FreeBSD's /usr/bin/true:
-r-xr-xr-x  1 root  wheel  4624 Nov 20 11:56 /usr/bin/true
  text   data   bss    dec     hex   filename
  1540    481     8   2029   0x7ed   /usr/bin/true

which is little more than return(0), but also has a fair amount of
copyright and SCCS data.

Warner
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://minnie.tuhs.org/pipermail/tuhs/attachments/20171128/c102ce08/attachment.html>


More information about the TUHS mailing list