151 lines
3.2 KiB
Markdown
151 lines
3.2 KiB
Markdown
## To build:
|
|
|
|
``` <!---sh-->
|
|
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](../../bugs.html#2019_endoh).
|
|
|
|
|
|
## To use:
|
|
|
|
``` <!---sh-->
|
|
./prog
|
|
```
|
|
|
|
|
|
## Try:
|
|
|
|
If you have `gdb(1)` installed:
|
|
|
|
``` <!---sh-->
|
|
./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](%%REPO_URL%%/2019/endoh/try.sh) script has
|
|
only been tested with linux.
|
|
|
|
You might also wish to try:
|
|
|
|
``` <!---sh-->
|
|
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.
|
|
|
|
``` <!---sh-->
|
|
cc -g -O0 -o prog prog.c
|
|
```
|
|
|
|
Then, run it. You will see a segmentation fault.
|
|
|
|
``` <!---sh-->
|
|
$ ./prog
|
|
Segmentation fault (core dumped)
|
|
```
|
|
|
|
Let's debug. As usual, run it under gdb.
|
|
|
|
``` <!---sh-->
|
|
$ 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.
|
|
|
|
``` <!---sh-->
|
|
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
|
|
```
|
|
|
|
<!--
|
|
|
|
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
|
|
|
You are free to share and adapt this file under the terms of this license:
|
|
|
|
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
|
|
|
For more information, see:
|
|
|
|
https://creativecommons.org/licenses/by-sa/4.0/
|
|
|
|
-->
|