Please Enable JavaScript
IOCCC image by Matt Zucker

The International Obfuscated C Code Contest

2019/endoh - Most in need of debugging

Backtrace quine

← 2019/duble ↑ 2019 ↑ 2019/giles → C code Makefile Inventory Original C

Author:

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

Inventory for 2019/endoh

Primary files

Secondary files


Jump to: top

AltStyle によって変換されたページ (->オリジナル) /