>>107986447
$ cat > bad.c
void main(int argc, char **argv) {}
$ gcc bad.c && ./a.out; echo $?
41
$ clang bad.c && ./a.out; echo $?
bad.c:1:1: warning: return type of 'main' is not 'int' [-Wmain-return-type]
1 | void main(int argc, char **argv) {}
| ^
bad.c:1:1: note: change return type to 'int'
1 | void main(int argc, char **argv) {}
| ^~~~
| int
1 warning generated.
48
$ tcc bad.c && ./a.out; echo $?
193
$ tcc -run bad.c; echo $?
192
Huh yeah. And you do get garbage exit codes that way. I thought GCC supported this but I evidently edited my memory.
Here's a fun anecdote from Stephen Bourne: https://youtu.be/2kEJoWfobpA?t=1022