Merge pull request #999 from xexyl/ioccc-status-comment-fixes

This commit is contained in:
Landon Curt Noll authored and GitHub committed 2023-10-04 09:20:00 -07:00
commit 790115dd1c
11 files changed
+221 -36

No files matched your search

+1 -1
View File
@@ -39,7 +39,7 @@ include ../../var.mk
# Common C compiler warnings to silence
#
CSILENCE= -Wno-comment -Wno-deprecated-non-prototype -Wno-main -Wno-pedantic \
-Wno-return-type -Wno-strict-prototypes -Wno-unused-parameter
-Wno-return-type -Wno-strict-prototypes -Wno-unused-parameter -Wno-implicit-int
# Common C compiler warning flags
#
+11 -10
View File
@@ -2,13 +2,13 @@
#define _C_C(_)('\b'b'\b'>=C_C>'\t'b'\n')
#define C_C _|_
#define b *
#define C /b/
#define C /b b/
#define V _C_C(
main(/*/,('\b'*'\b'>=_|_>'\t'*'\n')
char **('\b'*'\b'>=_|_>'\t'*'\n')
* C program. (If you don't
* understand it look it
* up.) (In the /*/ /*C*/ manual)
main(/*C,V)
char **V;*/
/* C program. (If you don't
* understand it look it
* up.) (In the C */manual)
{
char _,__;
while (read(0,&__,1) & write((_=(_=~' '&__,/*/)),
@@ -17,12 +17,13 @@ char **('\b'*'\b'>=_|_>'\t'*'\n')
'\b'*'\b'|((_-52)%('\b'*'\b'+~' '&'\t'*'\n')+1),1),&_,1));
}
subr(/*C*/)
/*char *C;*/
{
#if 0
subr(C)
char *C;
{
C="Lint says "argument Manual isn't used." What's that
mean?"; while (write((read(C_C('"'-'/*"'/*"*/))?__:__-_+
'\b'b'\b'|((_-52)%('\b'b'\b'+C_C_('\t'b'\n'))+1),1),&_,1));
#endif
}
#endif
+1
View File
@@ -1,3 +1,4 @@
hague
hague.alt
hague.orig
prog.orig
+2 -2
View File
@@ -114,8 +114,8 @@ OBJ= ${PROG}.o
DATA=
TARGET= ${PROG}
#
ALT_OBJ=
ALT_TARGET=
ALT_OBJ= ${PROG}.alt.o
ALT_TARGET= ${PROG}.alt
#################
+27 -3
View File
@@ -9,9 +9,9 @@ UK
make all
```
NOTE: this entry uses `gets()` so you might get a warning about this when
compiling and running this program with some systems.
There is an alternate version which uses `fgets()`. See the Alternate code
section below as well as the [bugs.md](/bugs.md) file for more details as to why
it is worth having as an alternate version.
## To run:
@@ -29,6 +29,30 @@ International Obfuscated C Code Contest
Jim Hague
```
Also try:
```sh
echo IOCCC | ./hague
```
### Alternate code:
Whereas with some entries the change to `fgets()` (see the [FAQ](/faq.md) for
details on why this has been done) can be done in the original code this entry
is more complicated in that although both forms of input show the correct
output, one form segfaults after the output.
If you wish to use this alternate code, do:
```sh
make alt
```
Use `hague.alt` as you would `hague` above. As for which form will segfault
after outputting the text it is when text is piped into the program. Again see
the [bugs.md](/bugs.md) file for more details.
## Judges' remarks:
+28
View File
@@ -0,0 +1,28 @@
#define DIT (
#define DAH )
#define __DAH ++
#define DITDAH *
#define DAHDIT for
#define DIT_DAH malloc
#define DAH_DIT fgets
#define _DAHDIT char
_DAHDIT _DAH_[]="ETIANMSURWDKGOHVFaLaPJBXCYZQb54a3d2f16g7c8a90l?e'b.s;i,d:"
;main DIT DAH{_DAHDIT
DITDAH _DIT,DITDAH DAH_,DITDAH DIT_,
DITDAH _DIT_,DITDAH DIT_DAH DIT
DAH,DITDAH DAH_DIT DIT DAH;DAHDIT
DIT _DIT=DIT_DAH DIT 81 DAH,DIT_=_DIT
__DAH;_DIT=DAH_DIT DIT _DIT,81,stdin DAH,_DIT[strlen(_DIT)-1]='\0',_DIT!=NULL;__DIT
DIT'\n'DAH DAH DAHDIT DIT DAH_=_DIT;DITDAH
DAH_;__DIT DIT DITDAH
_DIT_?_DAH DIT DITDAH DIT_ DAH:'?'DAH,__DIT
DIT' 'DAH,DAH_ __DAH DAH DAHDIT DIT
DITDAH DIT_=2,_DIT_=_DAH_; DITDAH _DIT_&&DIT
DITDAH _DIT_!=DIT DITDAH DAH_>='a'? DITDAH
DAH_&223:DITDAH DAH_ DAH DAH; DIT
DITDAH DIT_ DAH __DAH,_DIT_ __DAH DAH
DITDAH DIT_+= DIT DITDAH _DIT_>='a'? DITDAH _DIT_-'a':0
DAH;}_DAH DIT DIT_ DAH{ __DIT DIT
DIT_>3?_DAH DIT DIT_>>1 DAH:'\0'DAH;return
DIT_&1?'-':'.';}__DIT DIT DIT_ DAH _DAHDIT
DIT_;{DIT void DAH write DIT 1,&DIT_,1 DAH;}
+2 -2
View File
@@ -4,7 +4,7 @@
#define DITDAH *
#define DAHDIT for
#define DIT_DAH malloc
#define DAH_DIT gets
#define DAH_DIT fgets
#define _DAHDIT char
_DAHDIT _DAH_[]="ETIANMSURWDKGOHVFaLaPJBXCYZQb54a3d2f16g7c8a90l?e'b.s;i,d:"
;main DIT DAH{_DAHDIT
@@ -12,7 +12,7 @@ DITDAH _DIT,DITDAH DAH_,DITDAH DIT_,
DITDAH _DIT_,DITDAH DIT_DAH DIT
DAH,DITDAH DAH_DIT DIT DAH;DAHDIT
DIT _DIT=DIT_DAH DIT 81 DAH,DIT_=_DIT
__DAH;_DIT==DAH_DIT DIT _DIT DAH;__DIT
__DAH;_DIT=DAH_DIT DIT _DIT,81,stdin DAH,_DIT[strlen(_DIT)-1]='\0',_DIT!=NULL;__DIT
DIT'\n'DAH DAH DAHDIT DIT DAH_=_DIT;DITDAH
DAH_;__DIT DIT DITDAH
_DIT_?_DAH DIT DITDAH DIT_ DAH:'?'DAH,__DIT
+19 -3
View File
@@ -469,11 +469,27 @@ the judges and shouldn't be fixed.
This entry uses `gets()` which is unsafe. In particular the buffer size is a
mere 81 and it does not read a single string at command invocation but instead
until the program is terminated. This size can be increased to start out but it
would be better if it used `fgets()`. This will be addressed in time but is
noted here as a reminder.
would be better if it used `fgets()`.
The way this entry is formed has made it not as simple as some of the others
that have been addressed.
that have been addressed at least in part. It is easy to get it to use `fgets()`
and this has been done in the [alternate code](1986/hague/hague.alt.c) but it
will segfault after outputting the (correct) text in one of the forms. In
particular whereas this:
```sh
./hague.alt
foo
works the following will print out the correct output but then segfault:
```
```sh
echo foo | ./hague.alt
```
Whether or not it is worth making the entry itself (since the output is correct)
this alt version is to be determined later but it's might very well not be.
## [1986/holloway](1986/holloway/holloway.c) ([README.md](1986/holloway/README.md))
+98
View File
@@ -88,6 +88,30 @@ some entries you should look at the original code as in `winner.orig.c` or
`prog.orig.c`. Sometimes the original is in an alt version like `winner.alt.c`
or `prog.alt.c`.
## Q: Why have some entries that originally used `gets()` been modified to use `fgets()`? Doesn't this tamper with the entry too much?
A fine line indeed has to be drawn here but it was decided that it is worth it
because of alarming warnings that can be displayed, in some systems at runtime
interspersed with the output of the program.
For instance in macOS the entry [1990/tbr](1990/tbr/README.md) would output the
warning in such a way that caused confusing output for the entry.
In some cases this is not so easy to fix and in one case at least there is an
alternate version that has the fix instead due to a problem it creates (correct
output but segfaults after the output in one of the forms of input).
In some cases it is not possible to fix or at least highly unlikely and so those
have mainly not been touched except one that has had the buffer size increased
(which could be done for others that are not possible to change to `fgets()` but
this has not been done).
In the future we, the judges, would prefer that entries use `fgets()` to prevent
these problems.
NOTE: due to 'compatibility reasons' `fgets()` stores the newline and `gets()`
does not. We're not sure how this is compatibility but either way it can cause a
problem and it is this that has complicated some fixes.
## Q: I cannot get entry XYZZY from year 19xx to compile!
@@ -800,3 +824,77 @@ exaggeration](https://books.google.com/books?id=ms3tce7BgJsC&lpg=PA134&vq=%22the
p.s. Here is an image of F. D. C. Willard:
[F D C Willard](png/F.D.C.Willard.png)
## Q: Why do Makefiles use `-Weverything` with `clang`? Don't you know that its use is not recommended by clang developers?
The use of `-Weverything` is limited to when one forces `CC=clang`. Users with
clang compilers are not required to set `CC=clang` but when they do,
`-Weverything` is enabled with all of its challenges, pedantic warnings, and
sometimes warnings about things that do not matter, some of which are frankly
frivolous and often downright dubious.
To enable this feature:
```sh
make clobber all CC=clang
```
or:
```sh
make clobber all 'CWARN+= -Weverything'
```
though it should be noted that if one tries `-Weverything` with compilers that
are not `clang` they might see something like:
```sh
echo 'int main(void) {}' > foo.c ; cc -Weverything foo.c -o foo
cc: error: unrecognized command-line option '-Weverything'
```
which means that it can't even be compiled. Thus the proper way to do it is the
first one.
IOCCC authors who have access to a `clang` compiler might wish to try they their
hand at compiling with `-Weverything` while using a minimum of `-Wno-foo`
statements. Sometimes there is a technical or pedantic issue that
`-Weverything` warns about that would merit a change to your C code. Of course
if you're running out of bytes due to rule 2[ab] one might not have much choice.
Thus is something that obfuscators simply sometimes have to deal with!
If you to try to use minimize the number of `-Wno-foo` options needed with
`-Weverything`, please mention this in your remarks about the entry, as the
judges note you attempt to honor it (see also below). In some cases your
obfuscated code will issue warnings with `-Weverything` no matter what: the
`-Wno-poison-system-directories` is a common example of this but there are
others as well.
If you do try for a warning clean `-Weverything`, keep on mind that while _your_
compile environment might be warning free, a different clang version or a
different build environment might still have warnings. For instance the warning
set is different in macOS (which by default is `clang` even when run as `gcc`!)
than linux! Given that your entry *MUST* work as documented, you may be safer to
say that your entry keeps the number of warnings and `-Wno-foo` options while
compiling with `clang -Weverything` at a minimum. Because if you claim zero
warnings, and we find a warning situation, this may diminish the value of your
entry as it is not as documented. Thus it might be wise to point this out and
also if you can test it in multiple platforms (or versions of `clang`, see
below note) this would be advisable.
NOTE: different versions of `clang` have other differences as well. For instance
a defect of `clang` (which was fixed in a lot of entries by [Cody Boone
Ferguson](/winners.html#Cody_Boone_Ferguson) and some were fixed by us, the
[judges](https://www.ioccc.org/judges.html) as well) is that it requires that
`main()`'s arguments to be of a specific type. However some versions of `clang`
are more strict in the number of args allowed. These reasons are part of why
numerous entries had to be modified so that `main()` calls another function
instead of doing it all in `main()`. Another reason was that some entries that
recursively called `main()` caused a crash or otherwise broke the entry in
modern systems. Some entries do not work in `clang` (or at least do not work
completely) due to these defects, for instance
[1989/westley](1989/westley/README.md).
As you can see, using `clang` has some additional problems to work out but if
you can get your entry to work well in `clang` it might very well be considered
better than other entries.
+15
View File
@@ -133,6 +133,21 @@ like to refer you to the original file in
[sicherman.alt.c](1985/sicherman/sicherman.alt.c) and he suggests that you then compare it
to [sicherman.c](1985/sicherman/sicherman.c) for some good old C-fashioned fun!
Later on Cody improved the fix so that it looks much more like the original
entry which can be found in
[1985/sicherman/sicherman.orig.c](1985/sicherman/sicherman.orig.c).
## [1986/hague](1986/hague/hague.c) ([README.md](1986/hague/README.md]))
Cody added alt code that uses `fgets()` to avoid alarming and annoying warnings
about `gets()` being unsafe. The reason this is alt code, at least for now, is
that although it will print the results in both forms of invocation, after the
output in one invocation form it will segfault. This might be addressed later on
or it might be decided that it is worth it, with a caveat in the Makefile or at
least the README.md file, since it still prints out the correct output, though
that seems like it might not be so ideal unless it can be fixed (which might be
done). See the [bugs.md](/bugs.md) file for details.
## [1986/holloway](1986/holloway/holloway.c) ([README.md](1986/holloway/README.md]))
+17 -15
View File
@@ -8,25 +8,16 @@
# https://xexyl.net Cody Boone Ferguson
# https://ioccc.xexyl.net
#
# The script is at this just point a proof of concept but it does work, allowing
# one to update the date of the latest news, the date of the status, the status
# version and the status of the contest. It's not required to update all or for
# that matter any of them.
#
# If that is not clear: it might or might not be needed or desired and that is
# perfectly okay. If it's used but modified that's also okay. It gave me
# something to do and whether or not it's useful it has served a purpose.
#
# If -s option is used, the status field is updated, providing that the status
# arg is either "closed" or "open".
#
# If the -d or -n flags are used then it will update the status_date or
# latest_news fields, respectively.
#
# If the -I status_ver option is used the IOCCC_status_version field will be
# If the -i status_ver option is used the IOCCC_status_version field will be
# updated.
#
export IOCCC_STATUS_VERSION="0.0.1-0 2023-10-02" # major.minor.release-patch YYYY-MM-DD
export IOCCC_STATUS_SCRIPT_VERSION="0.0.2-0 2023-10-04" # major.minor.release-patch YYYY-MM-DD
USAGE="usage: $(basename "$0") [-h] [-V] [-v level] [-s status] [-d] [-n] [-i status_ver] status.json
@@ -41,9 +32,11 @@ USAGE="usage: $(basename "$0") [-h] [-V] [-v level] [-s status] [-d] [-n] [-i st
-n update latest_news date
-i status_ver update IOCCC_status_version
NOTE: version must match the regexp: ^[0-9]+\.[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2}$
status.json the file to update
status version: $IOCCC_STATUS_VERSION"
status version: $IOCCC_STATUS_SCRIPT_VERSION"
export UPDATE_DATE=""
export UPDATE_NEWS=""
@@ -61,7 +54,7 @@ while getopts :hVv:s:dni: flag; do
h) echo "$USAGE" 1>&2
exit 2
;;
V) echo "$IOCCC_STATUS_VERSION" 1>&2
V) echo "$IOCCC_STATUS_SCRIPT_VERSION" 1>&2
exit 2
;;
v) VERBOSITY="$OPTARG";
@@ -120,11 +113,20 @@ if [[ ! -r $STATUS_JSON_FILE ]]; then
exit 1
fi
# check that if -s used that the status ($STATUS) is either 'open' or 'closed'
# check that if -s ($STATUS_FLAG) used that the status ($STATUS) is either 'open' or 'closed'
if [[ -n "$STATUS_FLAG" ]]; then
if [[ "$STATUS" != "open" && "$STATUS" != "closed" ]]; then
echo "$0: ERROR: status must be 'open' or 'closed'" 1>&2
exit 1
exit 3
fi
fi
# check format of IOCCC_status_version if set (-i used, $UPDATE_IOCCC_STATUS_VERSION)
if [[ -n "$UPDATE_IOCCC_STATUS_VERSION" ]]; then
echo "$IOCCC_STATUS_VERSION" | grep -qE '^[0-9]+\.[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2}$'
if [[ "${PIPESTATUS[1]}" -ne 0 ]]; then
echo "$0: ERROR: IOCCC_status_version must match the regexp: '^[0-9]+\.[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2}$'" 1>&2
exit 3
fi
fi