Merge pull request #864 from xexyl/1998-schweikh2-gcc
This commit is contained in:
6 files changed
+44
-40
No files matched your search
@@ -1,2 +1 @@
|
|||||||
schweikh2
|
schweikh2
|
||||||
schweikh2.alt
|
|
||||||
@@ -111,8 +111,8 @@ OBJ= ${PROG}.o
|
|||||||
DATA=
|
DATA=
|
||||||
TARGET= ${PROG}
|
TARGET= ${PROG}
|
||||||
#
|
#
|
||||||
ALT_OBJ= ${PROG}.alt.o
|
ALT_OBJ=
|
||||||
ALT_TARGET= ${PROG}.alt
|
ALT_TARGET=
|
||||||
|
|
||||||
# FORCE use of -trigraphs
|
# FORCE use of -trigraphs
|
||||||
#
|
#
|
||||||
|
|||||||
+27
-16
@@ -14,10 +14,6 @@ Germany
|
|||||||
make all
|
make all
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: Almost every compiler is supposed to be able to accept the code in
|
|
||||||
[schweikh2.c](schweikh2.c); try compiling [schweikh2.alt.c](schweikh2.alt.c]) to
|
|
||||||
see if your compiler is fully standard-compliant.
|
|
||||||
|
|
||||||
## To run:
|
## To run:
|
||||||
|
|
||||||
|
|
||||||
@@ -57,17 +53,19 @@ What happens if you don't put in any number like the below?
|
|||||||
Run the program with a small argument, like 5 or 10, several times. Are the
|
Run the program with a small argument, like 5 or 10, several times. Are the
|
||||||
results different? Why?
|
results different? Why?
|
||||||
|
|
||||||
Some non-gcc compilers that are not fully ANSI standard do not compile this
|
### Historical remarks:
|
||||||
entry correctly.
|
|
||||||
|
At the time of judging, some non-gcc compilers that were not fully ANSI standard
|
||||||
|
did not compile this entry correctly.
|
||||||
|
|
||||||
At the time this hint file was written, some gcc and egcs implementations ran
|
At the time this hint file was written, some gcc and egcs implementations ran
|
||||||
into problem when building the original entry:
|
into problem when building the original entry:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make schweikh2.alt
|
make schweikh2
|
||||||
```
|
```
|
||||||
|
|
||||||
This program often will produce an error of the form:
|
This program often produced an error of the form:
|
||||||
|
|
||||||
```
|
```
|
||||||
gcc -ansi schweikh2.alt.c -o schweikh2.alt
|
gcc -ansi schweikh2.alt.c -o schweikh2.alt
|
||||||
@@ -102,7 +100,7 @@ and the lone `"` after the `#.file` line results in an assembler syntax error.
|
|||||||
In some cases one must compile using `gcc -g`:
|
In some cases one must compile using `gcc -g`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make schweikh2.alt CFLAGS=-g
|
make schweikh2 CFLAGS=-g
|
||||||
```
|
```
|
||||||
|
|
||||||
to trigger this error.
|
to trigger this error.
|
||||||
@@ -111,19 +109,32 @@ And with the proper text beyond the `\012`, it may be possible to have
|
|||||||
all kinds of fun adding `inline assembly` via `#line` directives. :-)
|
all kinds of fun adding `inline assembly` via `#line` directives. :-)
|
||||||
For extra credit:
|
For extra credit:
|
||||||
|
|
||||||
If your compiler has this bug, transform the line in the C
|
If your compiler had this bug, you could transform the line in the C program to
|
||||||
program to inject assembly instructions in such a way that
|
inject assembly instructions in such a way that the program would compile.
|
||||||
the program will compile.
|
|
||||||
|
|
||||||
If you are able to do the above, try adding assembly instructions
|
If you were able to do the above, you could try adding assembly instructions so
|
||||||
so that it will compile, execute and do something interesting.
|
that it will compile, execute and do something interesting.
|
||||||
|
|
||||||
If you succeed in doing this (especially on FreeBSD, Linux or SPARC),
|
If you succeeded in doing this (especially on FreeBSD, Linux or SPARC),
|
||||||
email the author for a free pat on the back.
|
you could have emailed the author for a free pat on the back (and maybe you
|
||||||
|
still can :-) ).
|
||||||
|
|
||||||
NOTE: the author submitted the program as `yarng` so when trying the examples
|
NOTE: the author submitted the program as `yarng` so when trying the examples
|
||||||
below change `yarng` to `./schweikh2`.
|
below change `yarng` to `./schweikh2`.
|
||||||
|
|
||||||
|
However in 2023 it was observed that it is gcc that has a problem with the
|
||||||
|
compilation of the _modified_ program, giving an internal compiler error:
|
||||||
|
|
||||||
|
```
|
||||||
|
:10:16: warning: type defaults to 'int' in declaration of 'zero' [-Wimplicit-int]
|
||||||
|
: In function 'main':
|
||||||
|
:12:1: warning: missing terminating " character
|
||||||
|
:12:19: internal compiler error: invalid built-in macro "__FILE__"
|
||||||
|
```
|
||||||
|
|
||||||
|
so the string `"01\015"` was changed to `ONE(O(1,1,2,6,0,6))` and now it works
|
||||||
|
with both clang and gcc.
|
||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
### What this program does
|
### What this program does
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
#define _POSIX_SOURCE /* you are not supposed to understand this */
|
|
||||||
#define O(OOO,OO0,O00,O0O,OO,O0)\0##O0O%:%:OO\0##O0%:%:OOO\0##OO0%:%:O00
|
|
||||||
#include<signal.h>
|
|
||||||
static volatile sig_atomic_t One;
|
|
||||||
#include<stdlib.h>
|
|
||||||
#include<unistd.h>
|
|
||||||
#define Zero(NULL)#NULL
|
|
||||||
#define ONE(One) Zero(One)
|
|
||||||
int
|
|
||||||
|
|
||||||
??=line 10 ONE(O(1,1,2,6,0,6))
|
|
||||||
main (register zero, char **ONE)
|
|
||||||
%:
|
|
||||||
<% switch (sizeof __FILE__ < zero) case 1: return One /= zero;
|
|
||||||
{ auto one = zero = atoi (ONE<:zero-1:>);
|
|
||||||
do for (one += alarm (One |= (signal (__LINE__, (void(*)(register))main)
|
|
||||||
!= SIG_ERR)); One; ++one);
|
|
||||||
while (zero -= write (1, __FILE__+(one&1), 1));
|
|
||||||
return write (1, 1+__FILE__+1, 1) != 1;
|
|
||||||
%>}
|
|
||||||
@@ -8,7 +8,7 @@ static volatile sig_atomic_t One;
|
|||||||
#define ONE(One) Zero(One)
|
#define ONE(One) Zero(One)
|
||||||
int
|
int
|
||||||
|
|
||||||
#line 10 "01\015"
|
??=line 10 ONE(O(1,1,2,6,0,6))
|
||||||
main (register zero, char **ONE)
|
main (register zero, char **ONE)
|
||||||
%:
|
%:
|
||||||
<% switch (sizeof __FILE__ < zero) case 1: return One /= zero;
|
<% switch (sizeof __FILE__ < zero) case 1: return One /= zero;
|
||||||
|
|||||||
@@ -740,6 +740,20 @@ Additionally Cody provided an alternate version for macOS. See the README.md
|
|||||||
file for details on the alternate version.
|
file for details on the alternate version.
|
||||||
|
|
||||||
|
|
||||||
|
## [1998/schweikh2](1998/schweikh2/schweikh2.c) ([README.md](1998/schweikh2/README.md]))
|
||||||
|
|
||||||
|
Cody fixed the code to not trigger an internal compiler error in gcc:
|
||||||
|
|
||||||
|
```
|
||||||
|
:10:16: warning: type defaults to 'int' in declaration of 'zero' [-Wimplicit-int]
|
||||||
|
: In function 'main':
|
||||||
|
:12:1: warning: missing terminating " character
|
||||||
|
:12:19: internal compiler error: invalid built-in macro "__FILE__"
|
||||||
|
```
|
||||||
|
|
||||||
|
The string `"01\015"` had to be changed to `ONE(O(1,1,2,6,0,6))`.
|
||||||
|
|
||||||
|
|
||||||
## [2000/anderson](2000/anderson/anderson.c) ([README.md](2000/anderson/README.md]))
|
## [2000/anderson](2000/anderson/anderson.c) ([README.md](2000/anderson/README.md]))
|
||||||
|
|
||||||
Cody changed this entry to use `fgets()` instead of `gets()` to make it safer
|
Cody changed this entry to use `fgets()` instead of `gets()` to make it safer
|
||||||
|
|||||||
Reference in new issue
Block a user