Search code examples
xcodebisonmacos-high-sierra

bison 3.0.4 fails in Illegal instruction: 4 on macOS High Sierra 10.13


With update of macOS from 10.12 to 10.13, /usr/local/bin/bison stops working.

Problem:

$ /usr/local/bin/bison --version
Illegal instruction: 4

An attempt of rebuilding bison also fails and lldb reports EXC_BAD_INSTRUCTION.

$ lldb src/bison
(lldb) target create "src/bison"
Current executable set to 'src/bison' (x86_64).
(lldb) run
Process 25732 launched: '/Users/xxxx/src/bison/bison-3.0.4/src/bison' (x86_64)
Process 25732 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
    frame #0: 0x00007fff68e39a23 libsystem_c.dylib`__vfprintf + 16437
libsystem_c.dylib`__vfprintf:
->  0x7fff68e39a23 <+16437>: ud2    
    0x7fff68e39a25 <+16439>: nopl   (%rax)
    0x7fff68e39a28 <+16442>: retq   
Target 0: (bison) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
  * frame #0: 0x00007fff68e39a23 libsystem_c.dylib`__vfprintf + 16437
    frame #1: 0x00007fff68e5e0a9 libsystem_c.dylib`__v2printf + 473
    frame #2: 0x00007fff68e434c7 libsystem_c.dylib`_vsnprintf + 415
    frame #3: 0x00007fff68e43524 libsystem_c.dylib`vsnprintf_l + 41
    frame #4: 0x00007fff68e344ec libsystem_c.dylib`snprintf + 180
    frame #5: 0x00000001000465a8 bison`vasnprintf(resultbuf=<unavailable>, lengthp=<unavailable>, format=<unavailable>, args=<unavailable>) at vasnprintf.c:0 [opt]
    frame #6: 0x0000000100042916 bison`rpl_fprintf(fp=0x00007fffa211d240, format=<unavailable>) at fprintf.c:45 [opt]
    frame #7: 0x0000000100042532 bison`error(status=0, errnum=0, message="%s: missing operand") at error.c:315 [opt]
    frame #8: 0x0000000100008301 bison`getargs(argc=1, argv=0x00007ffeefbff8c0) at getargs.c:0 [opt]
    frame #9: 0x000000010000d70a bison`main(argc=1, argv=0x00007ffeefbff8c0) at main.c:81 [opt]
    frame #10: 0x00007fff68da2145 libdyld.dylib`start + 1

Workaround: if you use Xcode 9, whose gcc version might be Apple LLVM version 9.0.0. Apply a patch by adding (defined __APPLE__ && __clang_major__ >= 9) to the #if macro in a source file of bison. Then rebuild and reinstall it.

$ diff -u  lib/vasnprintf.c.original lib/vasnprintf.c
--- lib/vasnprintf.c.original   2015-01-05 01:46:03.000000000 +0900
+++ lib/vasnprintf.c    2017-10-13 16:38:49.000000000 +0900
@@ -4858,7 +4858,7 @@
 #endif
                   *fbp = dp->conversion;
 #if USE_SNPRINTF
-# if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# if !((defined __APPLE__ && __clang_major__ >= 9) || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
                 fbp[1] = '%';
                 fbp[2] = 'n';
                 fbp[3] = '\0';

References: https://github.com/Homebrew/homebrew-core/issues/14418

Look for keywords bison and %n.

Read comments in the source code around the patched line.

If you know more reliable solutions, please let us know. Thanks!


Solution

  • This bug was reported on bug-bison on September 16 (2017), and according to the reply later that day by a bison maintainer, the bison source repository was updated shortly thereafter to fix the problem. However, a new source distribution was not created; in order to use the fix, it would be necessary to sync with the maint branch in the Bison Git repository, which includes a more recent version of gnulib. (I believe that building from the maint branch is not as simple as just downloading the source tarball, so this is not entirely satisfactory. Until there is a new bison source release, the fix you indicate may be the simplest option.)

    The gnulib fix is described in the bug-gnulib message linked from the bison bug report.

    As indicated in your link, the problem affects a number of other software packages, not just bison. That's not much consolation.