Synopsis: error with 'set -e' in /bin/sh
Category: system

Environment:
System      : OpenBSD 5.9
Details     : OpenBSD 5.9 (GENERIC) #1761: Fri Feb 26 01:15:04 MST 2016
[email protected]:/usr/src/sys/arch/amd64/compile/GENERIC

Architecture: OpenBSD.amd64
Machine     : amd64

Description:

  Bourne shell script with '-e' enabled sometimes runs past failing
  commands

How-To-Repeat:

  I haven't been able to distill it down to a smaller testcase, so
  please bear with me.

    ## initial setup

    $ cat y0.c
    int foo() {
      return 34;
    }

    $ cat y1.c
    int bar () {
      return 35  /* some syntax error, say missing ';' */
    }

    $ touch y0.o y1.o
    $ touch y0.c y1.c  # .c files newer than .o files

    $ cat build
    #!/bin/sh
    # stupid make replacement
    set -e
    for f in 0 1
    do
      echo checking y$f
      [ y$f.c -nt y$f.o ] && gcc -c y$f.c
    # echo  # <=== line A disabled (see below)
    done
    echo ZZZ  # should never get here since compiling y1.c errors

    ## first run

    $ ./build
    checking y0
    checking y1
    y1.c: In function 'main':
    y1.c:5: error: expected ';' before '}' token
    # no ZZZ printed; all is well

    ## second run

    $ touch y0.o  # y0.o newer than y0.c, y1.o older than y1.c

    $ ./build
    checking y0
    checking y1
    y1.c: In function 'main':
    y1.c:5: error: expected ';' before '}' token
    ZZZ  # <=== whoops!

    ## third run

    # uncomment line A in 'build' script
    $ cat build
    #!/bin/sh
    set -e
    for f in 0 1
    do
      echo checking y$f
      [ y$f.c -nt y$f.o ] && gcc -c y$f.c
      echo  # <=== line A ENABLED
    done
    echo ZZZ

    # Now ZZZ never prints regardless of relative modified times.

To summarize, the second run above shows a situation where /bin/sh
executes commands after error in spite of 'set -e'. Furthermore,
(third run) adding any *working* command to the loop *after* the
failing command causes it to bail correctly on error.

While this report was sent from OpenBSD 5.9, the error also occurs in
the most recent snapshot.

dmesg:
OpenBSD 5.9 (GENERIC) #1761: Fri Feb 26 01:15:04 MST 2016
    [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
real mem = 788381696 (751MB)
avail mem = 760381440 (725MB)
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xf6a20 (9 entries)
bios0: vendor SeaBIOS version
"rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org" date 04/01/2014
bios0: QEMU Standard PC (i440FX + PIIX, 1996)
acpi0 at bios0: rev 0
acpi0: sleep states S3 S4 S5
acpi0: tables DSDT FACP APIC HPET
acpi0: wakeup devices
acpitimer0 at acpi0: 3579545 Hz, 24 bits
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: Virtual CPU 714389bda930, 2400.39 MHz
cpu0: 
FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,SSE3,PCLMUL,SSSE3,FMA3,CX16,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,HV,NXE,LONG,LAHF,ABM,FSGSBASE,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,ARAT
cpu0: 64KB 64b/line 2-way I-cache, 64KB 64b/line 2-way D-cache, 512KB
64b/line 16-way L2 cache
cpu0: ITLB 255 4KB entries direct-mapped, 255 4MB entries direct-mapped
cpu0: DTLB 255 4KB entries direct-mapped, 255 4MB entries direct-mapped
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
cpu0: apic clock running at 1000MHz
ioapic0 at mainbus0: apid 0 pa 0xfec00000, version 11, 24 pins
acpihpet0 at acpi0: 100000000 Hz
acpiprt0 at acpi0: bus 0 (PCI0)
acpicpu0 at acpi0: C1(@1 halt!)
pvbus0 at mainbus0: KVM
pci0 at mainbus0 bus 0
pchb0 at pci0 dev 0 function 0 "Intel 82441FX" rev 0x02
pcib0 at pci0 dev 1 function 0 "Intel 82371SB ISA" rev 0x00
pciide0 at pci0 dev 1 function 1 "Intel 82371SB IDE" rev 0x00: DMA,
channel 0 wired to compatibility, channel 1 wired to compatibility
pciide0: channel 0 disabled (no drives)
atapiscsi0 at pciide0 channel 1 drive 0
scsibus1 at atapiscsi0: 2 targets
cd0 at scsibus1 targ 0 lun 0: <QEMU, QEMU DVD-ROM, 2.5+> ATAPI 5/cdrom removable
cd0(pciide0:1:0): using PIO mode 4, DMA mode 2
uhci0 at pci0 dev 1 function 2 "Intel 82371SB USB" rev 0x01: apic 0 int 11
piixpm0 at pci0 dev 1 function 3 "Intel 82371AB Power" rev 0x03: apic 0 int 9
iic0 at piixpm0
vga1 at pci0 dev 2 function 0 "Cirrus Logic CL-GD5446" rev 0x00
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
virtio0 at pci0 dev 3 function 0 "Qumranet Virtio Network" rev 0x00
vio0 at virtio0: address 56:00:00:44:57:84
virtio0: apic 0 int 11
virtio1 at pci0 dev 4 function 0 "Qumranet Virtio Storage" rev 0x00
vioblk0 at virtio1
scsibus2 at vioblk0: 2 targets
sd0 at scsibus2 targ 0 lun 0: <VirtIO, Block Device, > SCSI3 0/direct fixed
sd0: 15360MB, 512 bytes/sector, 31457280 sectors
virtio1: apic 0 int 11
virtio2 at pci0 dev 5 function 0 "Qumranet Virtio Memory" rev 0x00
viomb0 at virtio2
virtio2: apic 0 int 10
virtio3 at pci0 dev 6 function 0 "Qumranet Virtio RNG" rev 0x00
viornd0 at virtio3
virtio3: apic 0 int 10
isa0 at pcib0
isadma0 at isa0
fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
fd0 at fdc0 drive 1: density unknown
pckbc0 at isa0 port 0x60/5 irq 1 irq 12
pckbd0 at pckbc0 (kbd slot)
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pms0 at pckbc0 (aux slot)
wsmouse0 at pms0 mux 0
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
usb0 at uhci0: USB revision 1.0
uhub0 at usb0 "Intel UHCI root hub" rev 1.00/1.00 addr 1
nvram: invalid checksum
uhidev0 at uhub0 port 1 configuration 1 interface 0 "QEMU QEMU USB
Tablet" rev 2.00/0.00 addr 2
uhidev0: iclass 3/0
ums0 at uhidev0: 3 buttons, Z dir
wsmouse1 at ums0 mux 0
vscsi0 at root
scsibus3 at vscsi0: 256 targets
softraid0 at root
scsibus4 at softraid0: 256 targets
root on sd0a (e876e758f67a0bbc.a) swap on sd0b dump on sd0b
WARNING: /mnt was not properly unmounted
clock: unknown CMOS layout

usbdevs:
Controller /dev/usb0:
addr 1: full speed, self powered, config 1, UHCI root hub(0x0000),
Intel(0x8086), rev 1.00
 port 1 addr 2: full speed, power 100 mA, config 1, QEMU USB
Tablet(0x0001), QEMU(0x0627), rev 0.00, iSerialNumber 42
 port 2 powered

Reply via email to