Files
ioccc/2019/endoh
Landon Curt Noll c78bda6c0f update tarballs due to recent commits
The commit a1c86c8a7a modified
the navigation bars to include "Original C", so all tarballs
had be update, sorry (tm Canada 🇨🇦).  In particular:

The navigation bar for a winning entry now has a "_Original C_" link
(between the ✅ and the Inventory on the right hand side) so that one
may easily view the original C code that was submitted for IOCCC judging.

In addition, a number of other commits since that time
modified other winning entries.

Ran `make update` to perform the above.
2025-08-18 16:30:59 -07:00
..
2020-12-30 16:57:03 -08:00
2023-07-06 21:49:38 -07:00

To build:

    make

NOTE: the use of the C compiler optimiser was disabled and -g was enabled for this entry because it is SUPPOSED to crash and it needs debugging symbols.

Bugs and (Mis)features:

The current status of this entry is:

STATUS: INABIAF - please DO NOT fix

For more detailed information see 2019/endoh in bugs.html.

To use:

    ./prog

Try:

If you have gdb(1) installed:

    ./try.sh

Note that in macOS installing gdb(1) takes multiple steps - it's not just a matter of installing gdb(1) and that's that. The try.sh script has only been tested with linux.

You might also wish to try:

    gdb ./prog || lldb ./prog

and then type in r (to run program) and then bt (for backtrace).

Judges' remarks:

The purpose of this program is to crash. You'll want to have memorized man 7 ascii when debugging it to reveal its purpose.

Author's remarks:

backtrace quine:

Compile prog.c with no optimization.

    cc -g -O0 -o prog prog.c

Then, run it. You will see a segmentation fault.

    $ ./prog
    Segmentation fault (core dumped)

Let's debug. As usual, run it under gdb.

    $ gdb ./prog
    (gdb) run
    Starting program: /home/.../prog

    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000000000 in ?? ()

Okay, check the backtrace.

    (gdb) backtrace
    #0  0x0000000000000000 in ?? ()
    #1  0x0000555555555201 in x23 () at prog.c:35
    #2  0x000055555555571a in x64 () at prog.c:100
    #3  0x0000555555555747 in x65 () at prog.c:101
    #4  0x0000555555555774 in x66 () at prog.c:102
    #5  0x00005555555557ce in x69 () at prog.c:105
    #6  0x0000555555555828 in x6e () at prog.c:110
    #7  0x0000555555555747 in x65 () at prog.c:101
        ...

See the line numbers and lookup the ASCII table.

     35 = '#'
    100 = 'd'
    101 = 'e'
    102 = 'f'
    105 = 'i'
    110 = 'n'
    101 = 'e'
    ...

One more thing:

The original program can be used as a GDB command file.

    gdb -q -x prog.c ./prog | cat
    Reading symbols from ./prog...done.

    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000000000 in ?? ()
    #0  0x0000000000000000 in ?? ()
    #1  0x0000555555555201 in x23 () at prog.c:35
    #2  0x000055555555571a in x64 () at prog.c:100
    #3  0x0000555555555747 in x65 () at prog.c:101
    #4  0x0000555555555774 in x66 () at prog.c:102
    #5  0x00005555555557ce in x69 () at prog.c:105
    #6  0x0000555555555828 in x6e () at prog.c:110
    #7  0x0000555555555747 in x65 () at prog.c:101
    ...

By using this, you can confirm that it is actually a quine.

    gdb -q -x prog.c ./prog | sed -n -r 's/#.*:([0-9]+)/\1/p' | awk '{printf "%c",$1}' > prog2.c
    diff prog.c prog2.c