Restore Makefile section in guidelines

Other fixes were made as well, including in the rules. More work has to
be done still.
This commit is contained in:
Cody Boone Ferguson committed 2025-11-29 10:15:47 -08:00
1 parent 0ba38856aa
commit 4939cda9e1
4 files changed
+775 -201

No files matched your search

+340 -91
View File
@@ -452,36 +452,15 @@
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- BEFORE: 1st line of markdown file: next/guidelines.md -->
<!-- START: this line starts content from: inc/guidelines.closed.hdr -->
<h1 id="the-ioccc-is-closed">The IOCCC is closed</h1>
<p>The IOCCC is <strong>NOT</strong> accepting new submissions at this time. See the
<a href="../years.html">IOCCC winning entries page</a> for the entries that have won the
IOCCC in the past.</p>
<p>These guidelines are a <strong>TENTATIVE proposal</strong> for the next IOCCC
and are <strong>likely be to be updated</strong> before the next IOCCC.</p>
<p>See our
FAQ on “<a href="../faq.html#feedback">rules, guidelines, tools feedback</a>”
as well as our
FAQ on “<a href="../faq.html#question">about asking questions</a>”
about these guidelines. You might also find the FAQ in general useful, especially the
FAQ on “<a href="../quick-start.html#enter">how to enter the IOCCC</a>”.</p>
<p>Watch both <a href="../status.html">the IOCCC status page</a> and the
<a href="https://fosstodon.org/@ioccc"><span class="citation" data-cites="IOCCC">@IOCCC</span> mastodon feed</a> for information about
future IOCCC openings.</p>
<p><strong>HINT to mastodon users</strong>: You may wish to refresh the <a href="https://fosstodon.org/@ioccc"><span class="citation" data-cites="IOCCC">@IOCCC</span>
mastodon feed</a> page and/or mastodon
app from time to time to view IOCCC mastodon updates.</p>
<!-- END: the next line ends content from: inc/guidelines.closed.hdr -->
<!-- This is the last line modified by the tool: bin/gen-status.sh -->
<h1 id="th-international-obfuscated-c-code-contest-official-guidelines">29th International Obfuscated C Code Contest Official Guidelines</h1>
<p class="leftbar">
Copyright © 2025 Leonid A. Broukhis and Landon Curt Noll.
</p>
<p>All Rights Reserved. Permission for personal, education or non-profit use is
granted provided this this copyright and notice are included in its entirety
granted provided this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in
writing by <a href="../contact.html">contacting the judges</a>.</p>
<h1 id="ioccc-guidelines-version">IOCCC Guidelines version</h1>
<h1 id="guidelines-version">Guidelines Version</h1>
<p class="leftbar">
These IOCCC guidelines are version <strong>29.01 2025-11-29</strong>.
</p>
@@ -535,7 +514,7 @@ because of the <code>iocccsize(1)</code> algorithm.</p>
<p>Jump to: <a href="#">top</a></p>
<div id="guideline3">
<div id="guideline-3---register">
<h1 id="guidelines-for-rule-3---register-for-the-contest">Guidelines for <a href="rules.html#rule3-register">Rule 3 - Register for the contest</a></h1>
<h1 id="guidelines-for-rule-3---register-for-the-ioccc">Guidelines for <a href="rules.html#rule3-register">Rule 3 - Register for the IOCCC</a></h1>
</div>
</div>
<p>See FAQ on “<a href="../faq.html#author_handle_faq">What is an author handle?</a>”.</p>
@@ -557,10 +536,10 @@ because of the <code>iocccsize(1)</code> algorithm.</p>
<li>Etc.</li>
</ul>
<p>The IOCCC has a rich history of remarkable winning entries created by
authors who skillfully employed various techniques to develop their code.</p>
<p>If you do make use of such tools or services, then we <strong>ENCOURAGE you to describe
how you used such tools</strong> in your <code>remarks.md</code> file.</p>
<p>In short: You created it, you own it, and its an original work, or you have explicit permission.</p>
authors who skillfully employed various techniques to develop their code.
If you do make use of such tools or services, then we <strong>ENCOURAGE you to
describe how you used such tools</strong> in your <code>remarks.md</code> file.</p>
<p>In short: You created it, you own it, its an original work, or you have explicit permission to the work.</p>
<p>See FAQ on “<a href="../faq.html#ai">May I use AI, LLM, Virtual coding assistants, or similar tools to write my submission?</a>”.</p>
<p>Jump to: <a href="#">top</a></p>
<div id="guideline11">
@@ -568,40 +547,36 @@ how you used such tools</strong> in your <code>remarks.md</code> file.</p>
<h1 id="guidelines-for-rule-11---legal-rule-abuse">Guidelines for <a href="rules.html#rule11-legal-rule-abuse">Rule 11 - Legal rule abuse</a></h1>
</div>
</div>
<p>We try to avoid limiting creativity in our <a href="rules.html">IOCCC rules</a> so
we leave the contest open for creative rule interpretation.</p>
<p>We do realize that there are holes in the <a href="rules.html">IOCCC rules</a>, and invite
submitters to attempt to exploit them.</p>
submitters to attempt to apply creative rule interpretation. A rule abuse though, even
if not rewarded, may result in a subsequent rule change for future contests.</p>
<p>We sometime award ‘<strong>Best abuse of the rules</strong>’ or ‘<strong>Worst abuse of the rules</strong>’,
or some variation, to a submission that creatively attempts to exploit a holes in the
<a href="rules.html">IOCCC rules</a>.</p>
<p>When we do need to plug a hole in the <a href="rules.html">IOCCC rules</a> or
<a href="guidelines.html">IOCCC guidelines</a>, we will attempt to use a very small plug,
<p>When we do need to plug a hole in the <a href="rules.html">IOCCC rules</a>
or <a href="guidelines.html">IOCCC guidelines</a>, we will attempt to use a very small plug,
if not smaller.</p>
<p>Or, maybe not. :-)</p>
<p>Legal abuse of the <a href="rules.html">IOCCC rules</a> is somewhat encouraged. Legal rule abuse
may involve, but is not limited to, doing things that are technically allowed by
the <a href="rules.html">IOCCC rules</a> and yet do not fit the spirit of what we intended to be
submitted.</p>
<p>Legal rule abuse is encouraged to help promote creativity. Rule abuse
submissions, regardless of if they receive an award, result in changes to
the next year’s <a href="rules.html">IOCCC rules</a> and <a href="guidelines.html">IOCCC guidelines</a>.</p>
<p>Legal abuse of the <a href="rules.html">IOCCC rules</a> is <strong>NOT</strong> an invitation to violate the
<a href="rules.html">IOCCC rules</a>. A submission that violates the <a href="rules.html">rules</a> in the
opinion of the <a href="../judges.html">IOCCC judges</a>, <strong>WILL</strong> be
disqualified. <strong><em>RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!</em></strong> If you
have a submission that might otherwise be interesting, you might want to
submit two versions; one that does not abuse the <a href="rules.html">IOCCC rules</a> and one that
does, making sure to note in the one that does not abuse the rules that this is
another version, so that the judges do not assume you uploaded it by mistake.</p>
<p>Legal rule abuse may involve, but is not limited to, doing things that are
technically allowed by the <a href="rules.html">IOCCC rules</a> and yet do not fit the spirit of what
we intended to be submitted.</p>
<p>Legal abuse of the <a href="rules.html">IOCCC rules</a> is <strong>NOT</strong> an invitation to violate
the <a href="rules.html">IOCCC rules</a> (especailly <a href="./rules.html#rule-17---packaging">Rule 17 -
Packaging</a> ). A submission that violates the
<a href="rules.html">rules</a> in the opinion of the <a href="../judges.html">IOCCC judges</a>,
<strong>WILL</strong> be disqualified. <strong><em>RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!</em></strong></p>
<p>If you intend to abuse the <a href="rules.html">IOCCC rules</a>,
indicate so in your <code>remarks.md</code> file. You <strong>MUST</strong> try to justify
indicate so in your <code>remarks.md</code> file. You <strong>MUST</strong> try to justify, plead, beg,
why you consider your rule abuse to be allowed under the
<a href="rules.html">IOCCC rules</a>. That is, you must plead your case as to why
your submission is valid. Humor and/or creativity help plead a case.
<a href="rules.html">IOCCC rules</a>. Humor or creativity help plead a case.
As there is no guarantee that you will succeed, you might consider
submitting an alternate version that conforms to the
<a href="rules.html">IOCCC rules</a>.</p>
<p>If you have a submission that might otherwise be interesting, you might want to
submit two versions; one that does not abuse the <a href="rules.html">IOCCC rules</a> and
one that does, making sure to note in the one that does not abuse the rules that
this is another version, so that the judges do not assume you uploaded it by
mistake.</p>
<p>If you do bypass the <code>mkiocccentry(1)</code> warnings about
<a href="rules.html#rule-2a-gross-size">Rule 2a - Gross Size</a>
and/or about
@@ -611,14 +586,11 @@ rule and submit a submission anyway, you <strong>MUST</strong> try to justify wh
<a href="../judges.html">IOCCC judges</a> should not reject your submission due to a rule
violation, and you would be wise to do this towards the top of your <code>remarks.md</code>
file.</p>
<p>Abusing the web submission procedure tends to annoy us more
than amuse us. Spend your creative energy on content of your
submission rather than on the submission process itself.</p>
<p>We are often asked why the contest <a href="rules.html">IOCCC rules</a> and <a href="guidelines.html">IOCCC
guidelines</a> seem strange or contain mistakes, flaws or
grammatical errors. One reason is that we sometimes make genuine mistakes. But
in many cases such problems, flaws or areas of confusion are deliberate.
Changes to <a href="rules.html">IOCCC rules</a> and <a href="guidelines.html">IOCCC guidelines</a> in
guidelines</a> seem strange or contain mistakes, flaws, or
grammatical errors. One reason is that we sometimes make genuine mistakes, but
in many cases such problems, flaws or areas of confusion are deliberate.</p>
<p>Changes to <a href="rules.html">IOCCC rules</a> and <a href="guidelines.html">IOCCC guidelines</a> in
response to rule abuses, are done in a minimal fashion. Often we will
deliberately leave behind holes (or introduce new ones) so that future rule
abuse can continue. A clever author should be able to read them and “drive a
@@ -630,7 +602,7 @@ are only part of the overall contest. Even so, one might think the
contest <a href="rules.html">IOCCC rules</a> and <a href="guidelines.html">IOCCC guidelines</a> process as a parody
of the sometimes tragic mismatch between what a customer (or marketing) wants
and what engineering delivers. Real programmers must face obfuscated and
sometimes conflicting specifications and requirements from marketing, sales,
sometimes conflicting, balloning specifications, and requirements from marketing, sales,
product management and even from customers themselves on an all too regular basis.
This is one of the reasons why the <a href="rules.html">IOCCC rules</a> and
<a href="guidelines.html">IOCCC guidelines</a> are written in obfuscated form.</p>
@@ -640,13 +612,13 @@ This is one of the reasons why the <a href="rules.html">IOCCC rules</a> and
<h1 id="guidelines-for-rule-15---gnu-makefile">Guidelines for <a href="rules.html#rule15-gnu-makefile">Rule 15 - GNU Makefile</a></h1>
</div>
</div>
<p>You may use git, or services such as <a href="https://www.github.com">GitHub</a>
<p>You may use <code>git,</code> or services such as <a href="https://www.github.com">GitHub</a>
to develop and maintain your submission. However, we <strong>DISLIKE</strong>
submissions that <strong>require</strong> such services in order to build/compile your submission.</p>
<p>Submissions will be judged in an environment that has no <strong>IDE</strong>.
Any submission that fails to compile/build because it requires
an <strong>IDE</strong> will be rejected.</p>
<p>We will use the <code>make(1)</code> tool, your <code>Makefile</code>, as well as tools found in the
<p>We will use the <code>GNU make(1)</code> tool, your <code>Makefile</code>, as well as tools found in the
<a href="https://en.wikipedia.org/wiki/Single_UNIX_Specification">Single UNIX Specification</a>
environments, and commonly found on systems that reasonably conform to the
<a href="https://en.wikipedia.org/wiki/Single_UNIX_Specification">Single UNIX Specification</a>
@@ -664,7 +636,7 @@ course.</p>
</div>
<p>We <strong>STRONGLY</strong> recommend you <strong>do</strong> install the most recent release of
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
as use of using older versions of the mkiocccentry toolkit to are <strong>HIGHLY LIKELY</strong> to be <strong>REJECTED</strong>!</p>
As use of using older versions of the mkiocccentry toolkit to are <strong>HIGHLY LIKELY</strong> to be <strong>REJECTED</strong>!</p>
<p>If you submit your own JSON files (other than <code>.auth.json</code> and
<code>.info.json</code>) then they do <strong>NOT</strong> have to be valid JSON.</p>
<p>However, if you do provide invalid JSON files, <strong>PLEASE</strong>
@@ -714,10 +686,12 @@ FAQ on “<a href="../faq.html#makefile_details">What are the detailed recommend
FAQ on “<a href="../faq.html#rule17">What are the details behind Rule 17 - Use mkiocccentry?</a>”.</p>
<p>Jump to: <a href="#">top</a></p>
<div id="mkiocccentry">
</div>
<div id="mkiocccentry_toolkit">
</div>
<h1 id="guidelines-for-the-mkiocccentry-toolkit">Guidelines for the mkiocccentry toolkit</h1>
</div>
</div>
<p>The <a href="https://submit.ioccc.org">IOCCC submit server</a>, and related services
use the <strong>most recent version</strong> of the
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>:
@@ -725,10 +699,10 @@ submissions that package using older versions of the
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
are <strong>LIKELY</strong> to be <strong>REJECTED</strong>!</p>
<p>You <strong>REALLY SHOULD</strong> use the latest <a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
are <strong>LIKELY</strong> to be <strong>REJECTED</strong>! So you <strong>REALLY SHOULD</strong> use the latest <a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
to package your own submission.</p>
<p>The <code>mkiocccentry(1)</code> tool runs a number of checks by way of these
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
tools:</p>
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a> tools:</p>
<ul>
<li>iocccsize(1)</li>
<li>txzchk(1)</li>
@@ -736,42 +710,47 @@ tools:</p>
<li>chksubmit(1)</li>
<li>chkentry(1)</li>
</ul>
<p>Do <strong>NOT</strong> use <code>txzchk(1)</code> command line options that are labeled “<strong>for TESTING purposes</strong>”
in the <code>txzchk(1)</code> man page.</p>
<p>Do <strong>NOT</strong> use <code>txzchk(1)</code> or <code>fnamchk(1)</code> command line options that are labeled
“<strong>for TESTING purposes</strong>” in their respective man pages.</p>
<p>Do <strong>NOT</strong> use <code>fnamchk(1)</code> command line options that are labeled “<strong>for TESTING purposes</strong>”
in the <code>fnamchk(1)</code> man page.</p>
<p>Do <strong>NOT</strong> use <code>chkentry(1)</code> command line options that are labeled “<strong>for the use by the IOCCC judges only</strong>”
in the <code>chksubmit(1)</code> (or <code>chkentry(1)</code>) man page(s).</p>
in the <code>chksubmit(1)</code> (or <code>chkentry(1)</code>) man page(s).
Similarly do <strong>NOT</strong> use <code>chkentry(1)</code> command line options marked “<strong>for the use
by the IOCCC judges only</strong>” in the <code>chkentry(1)</code> man page.</p>
<p>To view <a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a> man pages,
while your current directory is the top of the source tree:</p>
<pre><code> man soup/man/man1/mkiocccentry.1
man soup/man/man1/iocccsize.1
man soup/man/man1/txzchk.1
man test_ioccc/man/man1/fnamchk.1
man soup/man/man1/chksubmit.1
man soup/man/man1/chkentry.1</code></pre>
<pre><code>man soup/man/man1/mkiocccentry.1
man soup/man/man1/iocccsize.1
man soup/man/man1/txzchk.1
man test_ioccc/man/man1/fnamchk.1
man soup/man/man1/chksubmit.1
man soup/man/man1/chkentry.1</code></pre>
<p>The above <code>man(1)</code> commands will show the toolkit man pages without having to install them first.</p>
<p>So that you do not have to repeatedly answer all the <code>mkiocccentry(1)</code> questions,
use <code>mkiocccentry -a answers ...</code> to create a file containing the answers you first give,
that will allow you to later use <code>mkiocccentry -i answers ...</code> to reuse those same answers.</p>
so later enter <code>mkiocccentry -i answers ...</code> to reuse those same answers.</p>
<p>The <code>mkiocccentry -A answers ...</code> does the same thing except that the <strong>answers file will be overwritten</strong>.</p>
<p>The <code>mkiocccentry -i answers ...</code> will still be required to confirm “<em>Yes/No</em>” questions.</p>
<p>Use <code>mkiocccentry -Y -i answers ..</code> to force a yes answers with <strong>great caution</strong>
because it might force a yes answer to something you do <strong>NOT</strong> want, such as a
change in your code that violates a detected rule.</p>
change in your code that violates a detected rule.
The <code>mkiocccentry -i answers ..</code> will still be required to confirm “<em>Yes/No</em>” questions.
While <code>mkiocccentry -Y -i answers ..</code> will force yes answers, use with <strong>great caution</strong>,
because it might force a yes answer to something you do <strong>NOT</strong> want.</p>
<p>To help with not having to repeatedly enter a UUID, put your UUID into a file and use
<code>mkiocccentry -u uuidfile ...</code>, or use <code>mkiocccentry -U UUID ...</code> to give the <code>UUID</code>
on the command line.</p>
<p>If you wish to <strong>test</strong> that your submission passes the <code>mkiocccentry(1)</code> tests
without having to type in in answers each time, you can use the <code>-d</code> or <code>-s seed</code>
without having to type in answers each time, you can use the <code>-d</code> or <code>-s seed</code>
option to <code>mkiocccentry</code> for the tool to pseudo-randomly create answers for you.
For example:</p>
<pre><code> mkiocccentry -d workdir topdir</code></pre>
<pre><code>mkiocccentry -d workdir topdir</code></pre>
<p>Do <strong>NOT</strong> submit a tarball formed by <code>mkiocccentry -d ..</code> <strong>OR</strong> by
<code>mkiocccentry -s seed ..</code> <strong>OR</strong> by using the <code>test</code> UUID!</p>
<p>The <code>mkiocccentry(1)</code> tool creates an <code>xz(1)</code> compressed <strong>v7 format</strong> tarball using a <code>tar(1)</code>
command of the form:</p>
<pre><code> cd workdir/UUID-slot_num &amp;&amp; tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num</code></pre>
<pre><code>cd workdir/UUID-slot_num &amp;&amp; tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num</code></pre>
<p>In many places the <code>mkiocccentry(1)</code> tool will prompt you to verify what you input, allowing you to
correct details as you go along.</p>
<p>Pressing the “<em>enter key</em>” at the <code>mkiocccentry(1)</code> tool prompts will allow you
@@ -785,7 +764,7 @@ run <code>txzchk(1)</code>, which will also run <code>fnamchk(1)</code>, as part
<p>The use of <code>mkiocccentry -W ....</code> is <strong>highly discouraged</strong> as this may ignore
warnings about a problem that may cause your submission to be <strong>REJECTED!</strong>”</p>
<p>If <code>mkiocccentry</code> encounters an <strong>error</strong>, the program will exit and the xz
compressed tarball <strong>will NOT be formed</strong>: this is a <strong>feature, not a bug</strong>!</p>
compressed tarball <strong>will NOT be generated</strong>: this is a <strong>feature, not a bug</strong>!</p>
<p>If you encounter a <strong>bug</strong> with the
<a href="https://github.com/ioccc-src/mkiocccentry">mkiocccentry toolkit</a>
<strong>PLEASE run the <code>bug_report.sh</code> script to help us out here!</strong></p>
@@ -795,9 +774,8 @@ then in order to run a tool outside the repo directory
you will have to specify <code>mkiocccentry(1)</code> command line options to locate required tools
such as <code>chkentry(1)</code> (<code>mkiocccentry -C chkentry ..</code>), <code>txzchk(1)</code> (<code>mkiocccentry -T txzchk ..</code>),
and <code>fnamchk(1)</code> (<code>mkiocccentry -F fnamchk ..</code>).</p>
<p>The <code>mkiocccentry(1)</code> tool will ignore any filename that begins with a “.” (dot).</p>
<p>The <code>mkiocccentry(1)</code> tool will ignore any directory tree with a directory name that begins with a “.” (dot).</p>
<p>The <code>mkiocccentry(1)</code> tool will all files that begin with <code>COPYING</code>, <code>COPYRIGHT</code>, and <code>LICENSE</code>, regardless
<p>The <code>mkiocccentry(1)</code> tool will ignore any filename or directory that begins with a period (<code>.</code>).</p>
<p>The <code>mkiocccentry(1)</code> tool will ignore all files that begin with <code>COPYING</code>, <code>COPYRIGHT</code>, and <code>LICENSE</code>, regardless
of filename case.</p>
<p>The <code>mkiocccentry(1)</code> tool will reject any of the following files if they are found directly under
the top level directory (<code>topdir</code>):</p>
@@ -848,9 +826,275 @@ FAQ on “<a href="../faq.html#about_mkiocccentry">What is mkiocccentry in simpl
<p>See
FAQ on “<a href="../faq.html#mkiocccentry">What is the mkiocccentry tool, how do I obtain it and how do I use it</a>”.</p>
<p>Jump to: <a href="#">top</a></p>
<div id="make">
<div id="makefile">
<h1 id="makefiles">Makefiles</h1>
</div>
</div>
<p class="leftbar">
We <strong>recommend</strong> AND <strong>encourage</strong> you to use the example Makefile,
as the starting point for your submission’s required <code>Makefile</code>:
</p>
<ul>
<li><a href="https://github.com/ioccc-src/winner/blob/master/next/Makefile.example">view example Makefile</a></li>
<li><a href="Makefile.example" download="Makefile">download example Makefile</a></li>
</ul>
<p class="leftbar">
Feel free to modify the <code>Makefile</code> to suit your obfuscation
needs.
</p>
<p class="leftbar">
<strong>Please</strong> add a space between the <code>=</code> and the value of variables, in the
<code>Makefile</code>, making sure that the <code>=</code> comes immediately after the name. See the
example <code>Makefile</code> for examples.
</p>
<p class="leftbar">
The rest of this section and its subsections will assume that you are using some
variant of the example <code>Makefile</code>, again renamed as <code>Makefile</code>.
</p>
<p class="leftbar">
We suggest that you compile your submission with a commonly available
<code>-std=gnu17</code> (ISO C 2017 with GNU extensions) C compiler, via <code>clang(1)</code>
and/or <code>gcc(1)</code>.
</p>
<div id="cflags">
<div id="flags">
<h2 id="default-compiler-flags">Default compiler flags</h2>
</div>
</div>
<p class="leftbar">
Unless you <strong>clearly state</strong> otherwise in your <code>remarks.md</code> file, <strong>AND</strong> put in
your submission’s <code>Makefile</code>, we <strong>will</strong> compile using <code>-std=gnu17 -O3</code>!
</p>
<p class="leftbar">
It <strong>is OK</strong> if you need to require your submission to <strong>NOT be</strong> compiled
using the default <code>-std=gnu17 -O3</code> settings. Simply <strong>explain why</strong>
your submission should NOT be compiled using <code>-std=gnu17 -O3</code> in
your <code>remarks.md</code> file, <strong>AND</strong> adjust your <code>Makefile</code> accordingly.
</p>
<p class="leftbar">
One reason that you might have to change the flags, is that the optimiser is
known to break some programs, but there are certainly other possible valid
reasons. Again, just update the <code>Makefile</code> and explain it in your <code>remarks.md</code>.
See the <a href="#optimiser">optimiser section</a> for details for changing optimiser
flags.
</p>
<p class="leftbar">
For more fun when it comes to optimisers breaking code, see
<a href="../1986/marshall/compilers.html">1986/marshall/compilers.html</a>.
</p>
<div id="compilers">
<h2 id="default-compiler">Default compiler</h2>
</div>
<p class="leftbar">
<strong>IMPORTANT NOTE</strong>: The use of <code>-std=gnu17</code> does <strong>NOT</strong> imply the use of the <code>gcc</code>
compiler! We often start by compiling using the <strong>clang</strong> C compiler instead.
</p>
<p class="leftbar">
<strong>PLEASE NOTE</strong>: in macOS, the compiler <code>gcc</code> found at <code>/usr/bin/gcc</code> is
in truth the <code>clang</code> compiler, as <code>/usr/bin/gcc --version</code> will show!
</p>
<div id="cstd">
<div id="standard">
<h2 id="c-standard">C standard</h2>
</div>
</div>
<p class="leftbar">
You may change the standard under which your submission is compiled
by modifying the <code>CSTD</code> Makefile variable. For example, to use <code>c99</code> instead:
</p>
<pre><code> CSTD= -std=c99</code></pre>
<div id="opt">
<div id="optimization">
<div id="optimisation">
<div id="optimizer">
<div id="optimiser">
<h2 id="default-optimisation-level">Default optimisation level</h2>
</div>
</div>
</div>
</div>
</div>
<p class="leftbar">
You may change the level of optimization and compiler debug level
that your submission is compiled with, by modifying the <code>OPT</code> Makefile variable.
For example, to compile without optimization, and to include debug symbols:
</p>
<pre><code> OPT= -O0 -g3</code></pre>
<div id="warnings">
<div id="cwarn">
<h2 id="compiler-warnings">Compiler warnings</h2>
</div>
</div>
<p class="leftbar">
The default warning flags are set via the <code>CWARN</code> variable, as shown in the
example <code>Makefile</code>:
</p>
<pre><code> # Common C compiler warning flags
#
CWARN= -Wall -Wextra ${CSILENCE} ${CUNKNOWN}</code></pre>
<p class="leftbar">
For details on <code>CSILENCE</code> and <code>CUNKNOWN</code>, see the <a href="#disabling-warnings">section on disabling
warnings</a>.
</p>
<div id="weverything">
<h3 id="the--weverything-option">The <code>-Weverything</code> option</h3>
</div>
<p class="leftbar">
For compilers, such as <code>clang</code>, that have the <code>-Weverything</code> option,
while you may wish to try it, you should read our
FAQ on “<a href="../faq.html#weverything">clang -Weverything</a>”.
We do <strong>NOT</strong> recommend that you put
the use of <code>-Weverything</code> into your submission’s <code>Makefile</code> for the reasons
cited there. This goes even if your version does not trigger a warning as some
other version might!
</p>
<p class="leftbar">
On the other hand, if <code>${CC}</code> has “<code>clang</code>” in the name, the example <code>Makefile</code> will
automatically enable <code>-Weverything</code>, so you might have to use <code>-Wno-foo</code>
options anyway, as detailed below. See the
FAQ on “<a href="../faq.html#weverything">-Weverything</a>”
for more details.
</p>
<p class="leftbar">
If “<code>clang</code>” is NOT in <code>${CC}</code>, the <code>CWARN</code> variable will not be further
modified.
</p>
<p class="leftbar">
There is no real penalty for compiler warnings. Sometimes
compiler warnings cannot be helped: especially in the case of
obfuscated C. :-) So if you cannot easily get rid of a compiler
warning, try not to fret too much.
</p>
<p class="leftbar">
We <strong>LIKE</strong> code that has a minimum of warnings, especially under the
more strict <code>-Wall -Wextra -pedantic</code> mode:
</p>
<pre><code> CWARN= -Wall -Wextra -pedantic</code></pre>
<p class="leftbar">
The two previous guidelines might be thought by some as being somewhat
contradictory. Isn’t life, and isn’t trying to satisfy “contradictory customer
requirements” all too often like that? :-) Try to minimize warnings if you
can.
</p>
<p class="leftbar">
If you manage to produce very few warnings, or perhaps no warnings at
all under the <code>-Wall -Wextra -pedantic</code> mode, then by all means brag about it in
your <code>remarks.md</code> file <strong>AND BE SURE TO TELL US</strong> the OS, OS version, compiler
and compiler version in which you observed this occurring (in case our OS and
compiler produces a different result: so your submission won’t be penalized for
not meeting your claims).
</p>
<p class="leftbar">
On the other hand, some warnings cannot be disabled and are enabled by compilers
without any warning option specified. These are sometimes inevitable in
obfuscated code and even in some non-obfuscated code, and you should not worry
about this, though it might be worth pointing out.
</p>
<p class="leftbar">
For instance, some compilers like to warn about use of pointers as arrays, which seems to
be dubious, as it obviously can’t (always) be avoided, being a big part of C, so
you should not worry about this either; this is the warning
<code>-Wunsafe-buffer-usage</code> and the way to disable it is <code>-Wno-unsafe-buffer-usage</code>.
See also the
FAQ on “<a href="../faq.html#forced_warnings">forced warnings</a>”
and the
FAQ on “<a href="../faq.html#weverything">-Weverything</a>”.
</p>
<h2 id="disabling-warnings">Disabling warnings</h2>
<p class="leftbar">
If you do have to disable warnings due to <code>-Weverything</code> automatically being
included, you might wish to state this fact in your <code>remarks.md</code> file.
And even without <code>-Weverything</code> there can be warnings, as noted above.
</p>
<p class="leftbar">
If your submission issues lots of warnings but is otherwise
marvelously obfuscated in multiple levels, don’t worry about it. Nevertheless,
be sure that the warnings do not constitute a potential “<strong>show stopper</strong>”
compiler problem. Be sure that compilers such as both <code>gcc</code> and <code>clang</code> won’t
produce a compiler <strong>error</strong> and refuse to compile your code: unless for some
reason that is what you intend to happen in which case document that too in your
<code>remarks.md</code> file. :-)
</p>
<p>All other things being equal, a program that must turn off fewer
warnings will be considered better, for certain values of better.</p>
<p class="leftbar">
To turn off a compiler warning, in your submission’s <code>Makefile</code>,
try something such as:
</p>
<pre><code> CSILENCE= -Wno-some-thing -Wno-another-thing</code></pre>
<p class="leftbar">
For instance:
</p>
<pre><code> CSILENCE= -Wno-parentheses -Wno-binding-in-condition -Wno-misleading-indentation</code></pre>
<p class="leftbar">
If you do add “<code>-Wno-foo</code>” to your Makefile, consider changing:
</p>
<pre><code> CUNKNOWN=</code></pre>
<p class="leftbar">
to:
</p>
<pre><code> CUNKNOWN= -Wno-unknown-warning-option</code></pre>
<p class="leftbar">
Some compilers have reported this as an error, however, and if you have
such a compiler you might want to not add it, or at least note in your
<code>remarks.md</code> file, which OS, OS version, compiler and compiler version
that has such a problem.
</p>
<div id="macros">
<h2 id="defining-macros-in-the-makefile">Defining macros in the Makefile</h2>
</div>
<p class="leftbar">
If you need to define something on the compile line, use
the <code>CDEFINE</code> Makefile variable. For example:
</p>
<pre><code> CDEFINE= -Dfoo -Dbar=baz</code></pre>
<p class="leftbar">
<strong>NOTE</strong>: just because we offer a default way to use the <code>-D</code> option, we still
do not like excess use of <code>-D</code> to get past size limits, especially since you
could use <code>#define</code> in your code instead.
</p>
<div id="include">
<h2 id="include-files-in-the-makefile">Include files in the Makefile</h2>
</div>
<p class="leftbar">
If you need to include a file (as in <code>#include</code>) on the command line, use the
<code>CINCLUDE</code> Makefile variable. For example:
</p>
<pre><code> CINCLUDE= -include stdio.h</code></pre>
<div id="magic">
<h2 id="magic-in-the-makefile">Magic in the Makefile</h2>
</div>
<p class="leftbar">
If you need to add other “<strong>magic</strong>” flags to your compile line,
use the <code>COTHER</code> Makefile variable. For example:
</p>
<pre><code> COTHER= -fno-math-errno</code></pre>
<p class="leftbar">
<strong>NOTE</strong>: <strong>We only recommend using “<em>magic</em>” flags if <em>BOTH</em> <code>gcc</code>
<em>and</em> <code>clang</code></strong> support it.
</p>
<p class="leftbar">
Again, please note that in macOS, <code>/usr/bin/gcc</code> is actually <code>clang</code>!
</p>
<div id="clobber">
<h2 id="the-clobber-rule">The clobber rule</h2>
</div>
<p class="leftbar">
When <code>make clobber</code> is invoked, we request that submissions be restored
to their original submission state. For example, any temporary files
(<strong>including</strong> the compiled program(s)) created during the build process, or
during execution should be removed by the <code>clobber</code> rule. In other words, the
only things that should be in the directory after running <code>make clobber</code> is what
is in your submission tarball itself.
</p>
<div id="general">
<h1 id="general-guidelines">General Guidelines</h1>
</div>
<div id="general">
</div>
<h1 id="general-overall-guidelines">General Overall Guidelines</h1>
<p>These <a href="guidelines.html">guideline</a> are <strong>hints</strong> and <strong>suggestions</strong>, <strong>NOT</strong> <a href="rules.html">IOCCC rules</a>.</p>
<p>While submissions that violate <a href="guidelines.html">guideline</a> are allowed,
submissions that remain within the <a href="guidelines.html">IOCCC guidelines</a> are preferred.</p>
@@ -922,10 +1166,12 @@ misleading comments and variable names might be a <strong>VERY GOOD START</stron
to a great submission!</p>
<p>Jump to: <a href="#">top</a></p>
<div id="likes">
</div>
<div id="dislikes">
</div>
<h1 id="our-likes-and-dislikes">OUR LIKES AND DISLIKES:</h1>
</div>
</div>
<p>We <strong>VERY MUCH LIKE</strong> submissions that use an edited variant of the
example Makefile, as described and linked to in the <a href="#makefile">Makefile section</a>,
renamed as <code>Makefile</code> of course. This makes it easier for the <a href="../judges.html">IOCCC judges</a>
@@ -1196,8 +1442,8 @@ MS Visual C and MS Visual C++ leave trailing control-M’s on lines.
Users of such tools should strip off such control-M’s before submitting
their submissions. In some cases tools have a “Save As” option that will
prevent such trailing control-M’s being added.</p>
<p>One should restrict libcurses to portable features found on BSD
or Linux curses.</p>
<p>One should restrict libcurses to portable features found on both BSD
and Linux curses.</p>
<p class="leftbar">
If you do <code>#include &lt;curses.h&gt;</code> make <strong>CERTAIN</strong> you link in curses (i.e.
<code>-lcurses</code>) and not ncurses (i.e. <code>-lncurses</code>).
@@ -1304,8 +1550,9 @@ is a <strong>hint</strong>. :-)</p>
<p>Try to be even more creative!</p>
<p>Jump to: <a href="#">top</a></p>
<div id="fun">
<h1 id="fundamental-guidelines">Fun😄damental Guidelines</h1>
</div>
<h1 id="fundamental-guidelines">Fun😄damental Guidelines</h1>
<p>The reason for the times of day are so that key IOCCC events are <strong>calculated</strong>
to be a <strong>fun</strong>ctional UTC time. :-)</p>
<p>At least 2 of several reasons for selecting the prime, 2503, for
@@ -1412,10 +1659,12 @@ CPU, we might just try your submission on that emulator as well :-)</p>
it? :-)</p>
<p>Jump to: <a href="#">top</a></p>
<div id="more-information">
</div>
<div id="information">
</div>
<h1 id="for-more-information">FOR MORE INFORMATION:</h1>
</div>
</div>
<p>For questions or comments about the contest, see <a href="../contact.html">Contacting the IOCCC</a>.</p>
<p><strong>Be SURE</strong> to review the <a href="index.html">IOCCC Rules and Guidelines</a> as they
may (and <strong>often do</strong>) change from year to year.</p>
+425 -104
View File
@@ -1,31 +1,4 @@
<!-- START: this line starts content from: inc/guidelines.closed.hdr -->
# The IOCCC is closed
The IOCCC is **NOT** accepting new submissions at this time. See the
[IOCCC winning entries page](../years.html) for the entries that have won the
IOCCC in the past.
These guidelines are a **TENTATIVE proposal** for the next IOCCC
and are **likely be to be updated** before the next IOCCC.
See our
FAQ on "[rules, guidelines, tools feedback](../faq.html#feedback)"
as well as our
FAQ on "[about asking questions](../faq.html#question)"
about these guidelines. You might also find the FAQ in general useful, especially the
FAQ on "[how to enter the IOCCC](../quick-start.html#enter)".
Watch both [the IOCCC status page](../status.html) and the
[@IOCCC mastodon feed](https://fosstodon.org/@ioccc) for information about
future IOCCC openings.
**HINT to mastodon users**: You may wish to refresh the [@IOCCC
mastodon feed](https://fosstodon.org/@ioccc) page and/or mastodon
app from time to time to view IOCCC mastodon updates.
<!-- END: the next line ends content from: inc/guidelines.closed.hdr -->
<!-- This is the last line modified by the tool: bin/gen-status.sh -->
# 29th International Obfuscated C Code Contest Official Guidelines
<p class="leftbar">
@@ -33,12 +6,12 @@ Copyright &copy; 2025 Leonid A. Broukhis and Landon Curt Noll.
</p>
All Rights Reserved. Permission for personal, education or non-profit use is
granted provided this this copyright and notice are included in its entirety
granted provided this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in
writing by [contacting the judges](../contact.html).
# IOCCC Guidelines version
# Guidelines Version
<p class="leftbar">
These IOCCC guidelines are version **29.01 2025-11-29**.
@@ -114,7 +87,7 @@ Jump to: [top](#)
<div id="guideline3">
<div id="guideline-3---register">
# Guidelines for [Rule 3 - Register for the contest](rules.html#rule3-register)
# Guidelines for [Rule 3 - Register for the IOCCC](rules.html#rule3-register)
</div>
</div>
@@ -143,11 +116,10 @@ While it is **NOT** required, you are allowed to use tools or services such as:
The IOCCC has a rich history of remarkable winning entries created by
authors who skillfully employed various techniques to develop their code.
If you do make use of such tools or services, then we **ENCOURAGE you to
describe how you used such tools** in your `remarks.md` file.
If you do make use of such tools or services, then we **ENCOURAGE you to describe
how you used such tools** in your `remarks.md` file.
In short: You created it, you own it, and its an original work, or you have explicit permission.
In short: You created it, you own it, its an original work, or you have explicit permission to the work.
See FAQ on "[May I use AI, LLM, Virtual coding assistants, or similar tools to write my submission?](../faq.html#ai)".
@@ -161,49 +133,44 @@ Jump to: [top](#)
</div>
</div>
We try to avoid limiting creativity in our [IOCCC rules](rules.html) so
we leave the contest open for creative rule interpretation.
We do realize that there are holes in the [IOCCC rules](rules.html), and invite
submitters to attempt to exploit them.
submitters to attempt to apply creative rule interpretation. A rule abuse though, even
if not rewarded, may result in a subsequent rule change for future contests.
We sometime award '**Best abuse of the rules**' or '**Worst abuse of the rules**',
or some variation, to a submission that creatively attempts to exploit a holes in the
[IOCCC rules](rules.html).
When we do need to plug a hole in the [IOCCC rules](rules.html) or
[IOCCC guidelines](guidelines.html), we will attempt to use a very small plug,
When we do need to plug a hole in the [IOCCC rules](rules.html)
or [IOCCC guidelines](guidelines.html), we will attempt to use a very small plug,
if not smaller.
Or, maybe not. :-)
Legal abuse of the [IOCCC rules](rules.html) is somewhat encouraged. Legal rule abuse
may involve, but is not limited to, doing things that are technically allowed by
the [IOCCC rules](rules.html) and yet do not fit the spirit of what we intended to be
submitted.
Legal rule abuse may involve, but is not limited to, doing things that are
technically allowed by the [IOCCC rules](rules.html) and yet do not fit the spirit of what
we intended to be submitted.
Legal rule abuse is encouraged to help promote creativity. Rule abuse
submissions, regardless of if they receive an award, result in changes to
the next year's [IOCCC rules](rules.html) and [IOCCC guidelines](guidelines.html).
Legal abuse of the [IOCCC rules](rules.html) is **NOT** an invitation to violate the
[IOCCC rules](rules.html). A submission that violates the [rules](rules.html) in the
opinion of the [IOCCC judges](../judges.html), **WILL** be
disqualified. **_RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!_** If you
have a submission that might otherwise be interesting, you might want to
submit two versions; one that does not abuse the [IOCCC rules](rules.html) and one that
does, making sure to note in the one that does not abuse the rules that this is
another version, so that the judges do not assume you uploaded it by mistake.
Legal abuse of the [IOCCC rules](rules.html) is **NOT** an invitation to violate
the [IOCCC rules](rules.html) (especailly [Rule 17 -
Packaging](./rules.html#rule-17---packaging) ). A submission that violates the
[rules](rules.html) in the opinion of the [IOCCC judges](../judges.html),
**WILL** be disqualified. **_RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!_**
If you intend to abuse the [IOCCC rules](rules.html),
indicate so in your `remarks.md` file. You **MUST** try to justify
indicate so in your `remarks.md` file. You **MUST** try to justify, plead, beg,
why you consider your rule abuse to be allowed under the
[IOCCC rules](rules.html). That is, you must plead your case as to why
your submission is valid. Humor and/or creativity help plead a case.
[IOCCC rules](rules.html). Humor or creativity help plead a case.
As there is no guarantee that you will succeed, you might consider
submitting an alternate version that conforms to the
[IOCCC rules](rules.html).
If you have a submission that might otherwise be interesting, you might want to
submit two versions; one that does not abuse the [IOCCC rules](rules.html) and
one that does, making sure to note in the one that does not abuse the rules that
this is another version, so that the judges do not assume you uploaded it by
mistake.
If you do bypass the `mkiocccentry(1)` warnings about
[Rule 2a - Gross Size](rules.html#rule-2a-gross-size)
and/or about
@@ -214,14 +181,11 @@ rule and submit a submission anyway, you **MUST** try to justify why the IOCCC
violation, and you would be wise to do this towards the top of your `remarks.md`
file.
Abusing the web submission procedure tends to annoy us more
than amuse us. Spend your creative energy on content of your
submission rather than on the submission process itself.
We are often asked why the contest [IOCCC rules](rules.html) and [IOCCC
guidelines](guidelines.html) seem strange or contain mistakes, flaws or
grammatical errors. One reason is that we sometimes make genuine mistakes. But
guidelines](guidelines.html) seem strange or contain mistakes, flaws, or
grammatical errors. One reason is that we sometimes make genuine mistakes, but
in many cases such problems, flaws or areas of confusion are deliberate.
Changes to [IOCCC rules](rules.html) and [IOCCC guidelines](guidelines.html) in
response to rule abuses, are done in a minimal fashion. Often we will
deliberately leave behind holes (or introduce new ones) so that future rule
@@ -235,7 +199,7 @@ are only part of the overall contest. Even so, one might think the
contest [IOCCC rules](rules.html) and [IOCCC guidelines](guidelines.html) process as a parody
of the sometimes tragic mismatch between what a customer (or marketing) wants
and what engineering delivers. Real programmers must face obfuscated and
sometimes conflicting specifications and requirements from marketing, sales,
sometimes conflicting, balloning specifications, and requirements from marketing, sales,
product management and even from customers themselves on an all too regular basis.
This is one of the reasons why the [IOCCC rules](rules.html) and
[IOCCC guidelines](guidelines.html) are written in obfuscated form.
@@ -250,7 +214,7 @@ Jump to: [top](#)
</div>
</div>
You may use git, or services such as [GitHub](https://www.github.com)
You may use `git,` or services such as [GitHub](https://www.github.com)
to develop and maintain your submission. However, we **DISLIKE**
submissions that **require** such services in order to build/compile your submission.
@@ -258,7 +222,7 @@ Submissions will be judged in an environment that has no **IDE**.
Any submission that fails to compile/build because it requires
an **IDE** will be rejected.
We will use the `make(1)` tool, your `Makefile`, as well as tools found in the
We will use the `GNU make(1)` tool, your `Makefile`, as well as tools found in the
[Single UNIX Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification)
environments, and commonly found on systems that reasonably conform to the
[Single UNIX Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification)
@@ -280,9 +244,10 @@ Jump to: [top](#)
</div>
</div>
We **STRONGLY** recommend you **do** install the most recent release of
[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry)
as use of using older versions of the mkiocccentry toolkit to are **HIGHLY LIKELY** to be **REJECTED**!
As use of using older versions of the mkiocccentry toolkit to are **HIGHLY LIKELY** to be **REJECTED**!
If you submit your own JSON files (other than `.auth.json` and
`.info.json`) then they do **NOT** have to be valid JSON.
@@ -352,11 +317,10 @@ FAQ on "[What are the details behind Rule 17 - Use mkiocccentry?](../faq.html#ru
Jump to: [top](#)
<div id="mkiocccentry">
<div id="mkiocccentry_toolkit">
<div id="mkiocccentry"></div>
<div id="mkiocccentry_toolkit"></div>
# Guidelines for the mkiocccentry toolkit
</div>
</div>
The [IOCCC submit server](https://submit.ioccc.org), and related services
use the **most recent version** of the
@@ -366,11 +330,11 @@ submissions that package using older versions of the
are **LIKELY** to be **REJECTED**!
You **REALLY SHOULD** use the latest [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry)
are **LIKELY** to be **REJECTED**! So you **REALLY SHOULD** use the latest [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry)
to package your own submission.
The `mkiocccentry(1)` tool runs a number of checks by way of these
[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry)
tools:
[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) tools:
* iocccsize(1)
* txzchk(1)
@@ -378,32 +342,34 @@ tools:
* chksubmit(1)
* chkentry(1)
Do **NOT** use `txzchk(1)` command line options that are labeled "**for TESTING purposes**"
in the `txzchk(1)` man page.
Do **NOT** use `txzchk(1)` or `fnamchk(1)` command line options that are labeled
"**for TESTING purposes**" in their respective man pages.
Do **NOT** use `fnamchk(1)` command line options that are labeled "**for TESTING purposes**"
in the `fnamchk(1)` man page.
Do **NOT** use `chkentry(1)` command line options that are labeled "**for the use by the IOCCC judges only**"
in the `chksubmit(1)` (or `chkentry(1)`) man page(s).
Similarly do **NOT** use `chkentry(1)` command line options marked "**for the use
by the IOCCC judges only**" in the `chkentry(1)` man page.
To view [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) man pages,
while your current directory is the top of the source tree:
``` <!---sh-->
man soup/man/man1/mkiocccentry.1
man soup/man/man1/iocccsize.1
man soup/man/man1/txzchk.1
man test_ioccc/man/man1/fnamchk.1
man soup/man/man1/chksubmit.1
man soup/man/man1/chkentry.1
man soup/man/man1/mkiocccentry.1
man soup/man/man1/iocccsize.1
man soup/man/man1/txzchk.1
man test_ioccc/man/man1/fnamchk.1
man soup/man/man1/chksubmit.1
man soup/man/man1/chkentry.1
```
The above `man(1)` commands will show the toolkit man pages without having to install them first.
So that you do not have to repeatedly answer all the `mkiocccentry(1)` questions,
use `mkiocccentry -a answers ...` to create a file containing the answers you first give,
that will allow you to later use `mkiocccentry -i answers ...` to reuse those same answers.
so later enter `mkiocccentry -i answers ...` to reuse those same answers.
The `mkiocccentry -A answers ...` does the same thing except that the **answers file will be overwritten**.
@@ -412,18 +378,21 @@ The `mkiocccentry -i answers ...` will still be required to confirm "_Yes/No_" q
Use `mkiocccentry -Y -i answers ..` to force a yes answers with **great caution**
because it might force a yes answer to something you do **NOT** want, such as a
change in your code that violates a detected rule.
The `mkiocccentry -i answers ..` will still be required to confirm "_Yes/No_" questions.
While `mkiocccentry -Y -i answers ..` will force yes answers, use with **great caution**,
because it might force a yes answer to something you do **NOT** want.
To help with not having to repeatedly enter a UUID, put your UUID into a file and use
`mkiocccentry -u uuidfile ...`, or use `mkiocccentry -U UUID ...` to give the `UUID`
on the command line.
If you wish to **test** that your submission passes the `mkiocccentry(1)` tests
without having to type in in answers each time, you can use the `-d` or `-s seed`
without having to type in answers each time, you can use the `-d` or `-s seed`
option to `mkiocccentry` for the tool to pseudo-randomly create answers for you.
For example:
``` <!---sh-->
mkiocccentry -d workdir topdir
mkiocccentry -d workdir topdir
```
Do **NOT** submit a tarball formed by `mkiocccentry -d ..` **OR** by
@@ -433,7 +402,7 @@ The `mkiocccentry(1)` tool creates an `xz(1)` compressed **v7 format** tarball u
command of the form:
``` <!---sh-->
cd workdir/UUID-slot_num && tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num
cd workdir/UUID-slot_num && tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num
```
In many places the `mkiocccentry(1)` tool will prompt you to verify what you input, allowing you to
@@ -454,7 +423,7 @@ The use of `mkiocccentry -W ....` is **highly discouraged** as this may ignore
warnings about a problem that may cause your submission to be **REJECTED!**"
If `mkiocccentry` encounters an **error**, the program will exit and the xz
compressed tarball **will NOT be formed**: this is a **feature, not a bug**!
compressed tarball **will NOT be generated**: this is a **feature, not a bug**!
If you encounter a **bug** with the
[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry)
@@ -467,11 +436,9 @@ you will have to specify `mkiocccentry(1)` command line options to locate requir
such as `chkentry(1)` (`mkiocccentry -C chkentry ..`), `txzchk(1)` (`mkiocccentry -T txzchk ..`),
and `fnamchk(1)` (`mkiocccentry -F fnamchk ..`).
The `mkiocccentry(1)` tool will ignore any filename that begins with a "." (dot).
The `mkiocccentry(1)` tool will ignore any filename or directory that begins with a period (`.`).
The `mkiocccentry(1)` tool will ignore any directory tree with a directory name that begins with a "." (dot).
The `mkiocccentry(1)` tool will all files that begin with `COPYING`, `COPYRIGHT`, and `LICENSE`, regardless
The `mkiocccentry(1)` tool will ignore all files that begin with `COPYING`, `COPYRIGHT`, and `LICENSE`, regardless
of filename case.
The `mkiocccentry(1)` tool will reject any of the following files if they are found directly under
@@ -540,10 +507,366 @@ FAQ on "[What is the mkiocccentry tool, how do I obtain it and how do I use it](
Jump to: [top](#)
<div id="make">
<div id="makefile">
# Makefiles
</div>
</div>
<p class="leftbar">
We **recommend** AND **encourage** you to use the example Makefile,
as the starting point for your submission's required `Makefile`:
</p>
- [view example Makefile](%%REPO_URL%%/next/Makefile.example)
- <a href="Makefile.example" download="Makefile">download example Makefile</a>
<p class="leftbar">
Feel free to modify the `Makefile` to suit your obfuscation
needs.
</p>
<p class="leftbar">
**Please** add a space between the `=` and the value of variables, in the
`Makefile`, making sure that the `=` comes immediately after the name. See the
example `Makefile` for examples.
</p>
<p class="leftbar">
The rest of this section and its subsections will assume that you are using some
variant of the example `Makefile`, again renamed as `Makefile`.
</p>
<p class="leftbar">
We suggest that you compile your submission with a commonly available
`-std=gnu17` (ISO C 2017 with GNU extensions) C compiler, via `clang(1)`
and/or `gcc(1)`.
</p>
<div id="cflags">
<div id="flags">
## Default compiler flags
</div>
</div>
<p class="leftbar">
Unless you **clearly state** otherwise in your `remarks.md` file, **AND** put in
your submission's `Makefile`, we **will** compile using `-std=gnu17 -O3`!
</p>
<p class="leftbar">
It **is OK** if you need to require your submission to **NOT be** compiled
using the default `-std=gnu17 -O3` settings. Simply **explain why**
your submission should NOT be compiled using `-std=gnu17 -O3` in
your `remarks.md` file, **AND** adjust your `Makefile` accordingly.
</p>
<p class="leftbar">
One reason that you might have to change the flags, is that the optimiser is
known to break some programs, but there are certainly other possible valid
reasons. Again, just update the `Makefile` and explain it in your `remarks.md`.
See the [optimiser section](#optimiser) for details for changing optimiser
flags.
</p>
<p class="leftbar">
For more fun when it comes to optimisers breaking code, see
[1986/marshall/compilers.html](../1986/marshall/compilers.html).
</p>
<div id="compilers">
## Default compiler
</div>
<p class="leftbar">
**IMPORTANT NOTE**: The use of `-std=gnu17` does **NOT** imply the use of the `gcc`
compiler! We often start by compiling using the **clang** C compiler instead.
</p>
<p class="leftbar">
**PLEASE NOTE**: in macOS, the compiler `gcc` found at `/usr/bin/gcc` is
in truth the `clang` compiler, as `/usr/bin/gcc --version` will show!
</p>
<div id="cstd">
<div id="standard">
## C standard
</div>
</div>
<p class="leftbar">
You may change the standard under which your submission is compiled
by modifying the `CSTD` Makefile variable. For example, to use `c99` instead:
</p>
``` <!---make-->
CSTD= -std=c99
```
<div id="opt">
<div id="optimization">
<div id="optimisation">
<div id="optimizer">
<div id="optimiser">
## Default optimisation level
</div>
</div>
</div>
</div>
</div>
<p class="leftbar">
You may change the level of optimization and compiler debug level
that your submission is compiled with, by modifying the `OPT` Makefile variable.
For example, to compile without optimization, and to include debug symbols:
</p>
``` <!---make-->
OPT= -O0 -g3
```
<div id="warnings">
<div id="cwarn">
## Compiler warnings
</div>
</div>
<p class="leftbar">
The default warning flags are set via the `CWARN` variable, as shown in the
example `Makefile`:
</p>
``` <!---sh-->
# Common C compiler warning flags
#
CWARN= -Wall -Wextra ${CSILENCE} ${CUNKNOWN}
```
<p class="leftbar">
For details on `CSILENCE` and `CUNKNOWN`, see the [section on disabling
warnings](#disabling-warnings).
</p>
<div id="weverything">
### The `-Weverything` option
</div>
<p class="leftbar">
For compilers, such as `clang`, that have the `-Weverything` option,
while you may wish to try it, you should read our
FAQ on "[clang -Weverything](../faq.html#weverything)".
We do **NOT** recommend that you put
the use of `-Weverything` into your submission's `Makefile` for the reasons
cited there. This goes even if your version does not trigger a warning as some
other version might!
</p>
<p class="leftbar">
On the other hand, if `${CC}` has "`clang`" in the name, the example `Makefile` will
automatically enable `-Weverything`, so you might have to use `-Wno-foo`
options anyway, as detailed below. See the
FAQ on "[-Weverything](../faq.html#weverything)"
for more details.
</p>
<p class="leftbar">
If "`clang`" is NOT in `${CC}`, the `CWARN` variable will not be further
modified.
</p>
<p class="leftbar">
There is no real penalty for compiler warnings. Sometimes
compiler warnings cannot be helped: especially in the case of
obfuscated C. :-) So if you cannot easily get rid of a compiler
warning, try not to fret too much.
</p>
<p class="leftbar">
We **LIKE** code that has a minimum of warnings, especially under the
more strict ` -Wall -Wextra -pedantic` mode:
</p>
``` <!---make-->
CWARN= -Wall -Wextra -pedantic
```
<p class="leftbar">
The two previous guidelines might be thought by some as being somewhat
contradictory. Isn't life, and isn't trying to satisfy "contradictory customer
requirements" all too often like that? :-) Try to minimize warnings if you
can.
</p>
<p class="leftbar">
If you manage to produce very few warnings, or perhaps no warnings at
all under the `-Wall -Wextra -pedantic` mode, then by all means brag about it in
your `remarks.md` file **AND BE SURE TO TELL US** the OS, OS version, compiler
and compiler version in which you observed this occurring (in case our OS and
compiler produces a different result: so your submission won't be penalized for
not meeting your claims).
</p>
<p class="leftbar">
On the other hand, some warnings cannot be disabled and are enabled by compilers
without any warning option specified. These are sometimes inevitable in
obfuscated code and even in some non-obfuscated code, and you should not worry
about this, though it might be worth pointing out.
</p>
<p class="leftbar">
For instance, some compilers like to warn about use of pointers as arrays, which seems to
be dubious, as it obviously can't (always) be avoided, being a big part of C, so
you should not worry about this either; this is the warning
`-Wunsafe-buffer-usage` and the way to disable it is `-Wno-unsafe-buffer-usage`.
See also the
FAQ on "[forced warnings](../faq.html#forced_warnings)"
and the
FAQ on "[-Weverything](../faq.html#weverything)".
</p>
<div id="disabling-warnings">
## Disabling warnings
</div>
<p class="leftbar">
If you do have to disable warnings due to `-Weverything` automatically being
included, you might wish to state this fact in your `remarks.md` file.
And even without `-Weverything` there can be warnings, as noted above.
</p>
<p class="leftbar">
If your submission issues lots of warnings but is otherwise
marvelously obfuscated in multiple levels, don't worry about it. Nevertheless,
be sure that the warnings do not constitute a potential "**show stopper**"
compiler problem. Be sure that compilers such as both `gcc` and `clang` won't
produce a compiler **error** and refuse to compile your code: unless for some
reason that is what you intend to happen in which case document that too in your
`remarks.md` file. :-)
</p>
All other things being equal, a program that must turn off fewer
warnings will be considered better, for certain values of better.
<p class="leftbar">
To turn off a compiler warning, in your submission's `Makefile`,
try something such as:
</p>
``` <!---make-->
CSILENCE= -Wno-some-thing -Wno-another-thing
```
<p class="leftbar">
For instance:
</p>
``` <!---make-->
CSILENCE= -Wno-parentheses -Wno-binding-in-condition -Wno-misleading-indentation
```
<p class="leftbar">
If you do add "`-Wno-foo`" to your Makefile, consider changing:
</p>
``` <!---make-->
CUNKNOWN=
```
<p class="leftbar">
to:
</p>
``` <!---make-->
CUNKNOWN= -Wno-unknown-warning-option
```
<p class="leftbar">
Some compilers have reported this as an error, however, and if you have
such a compiler you might want to not add it, or at least note in your
`remarks.md` file, which OS, OS version, compiler and compiler version
that has such a problem.
</p>
<div id="macros">
## Defining macros in the Makefile
</div>
<p class="leftbar">
If you need to define something on the compile line, use
the `CDEFINE` Makefile variable. For example:
</p>
``` <!---make-->
CDEFINE= -Dfoo -Dbar=baz
```
<p class="leftbar">
**NOTE**: just because we offer a default way to use the `-D` option, we still
do not like excess use of `-D` to get past size limits, especially since you
could use `#define` in your code instead.
</p>
<div id="include">
## Include files in the Makefile
</div>
<p class="leftbar">
If you need to include a file (as in `#include`) on the command line, use the
`CINCLUDE` Makefile variable. For example:
</p>
``` <!---make-->
CINCLUDE= -include stdio.h
```
<div id="magic">
## Magic in the Makefile
</div>
<p class="leftbar">
If you need to add other "**magic**" flags to your compile line,
use the `COTHER` Makefile variable. For example:
</p>
``` <!---make-->
COTHER= -fno-math-errno
```
<p class="leftbar">
**NOTE**: **We only recommend using "_magic_" flags if _BOTH_ `gcc`
_and_ `clang`** support it.
</p>
<p class="leftbar">
Again, please note that in macOS, `/usr/bin/gcc` is actually `clang`!
</p>
<div id="clobber">
## The clobber rule
</div>
<p class="leftbar">
When `make clobber` is invoked, we request that submissions be restored
to their original submission state. For example, any temporary files
(**including** the compiled program(s)) created during the build process, or
during execution should be removed by the `clobber` rule. In other words, the
only things that should be in the directory after running `make clobber` is what
is in your submission tarball itself.
</p>
<div id="general">
# General Guidelines
</div>
<div id="general"></div>
# General Overall Guidelines
These [guideline](guidelines.html) are **hints** and **suggestions**, **NOT** [IOCCC rules](rules.html).
@@ -639,11 +962,10 @@ to a great submission!
Jump to: [top](#)
<div id="likes">
<div id="dislikes">
<div id="likes"></div>
<div id="dislikes"></div>
# OUR LIKES AND DISLIKES:
</div>
</div>
We **VERY MUCH LIKE** submissions that use an edited variant of the
example Makefile, as described and linked to in the [Makefile section](#makefile),
@@ -1006,8 +1328,8 @@ Users of such tools should strip off such control-M's before submitting
their submissions. In some cases tools have a "Save As" option that will
prevent such trailing control-M's being added.
One should restrict libcurses to portable features found on BSD
or Linux curses.
One should restrict libcurses to portable features found on both BSD
and Linux curses.
<p class="leftbar">
If you do `#include <curses.h>` make **CERTAIN** you link in curses (i.e.
@@ -1136,9 +1458,9 @@ Try to be even more creative!
Jump to: [top](#)
<div id="fun">
<div id="fun"></div>
# Fun😄damental Guidelines
</div>
The reason for the times of day are so that key IOCCC events are **calculated**
to be a **fun**ctional UTC time. :-)
@@ -1271,11 +1593,10 @@ it? :-)
Jump to: [top](#)
<div id="more-information">
<div id="information">
<div id="more-information"></div>
<div id="information"></div>
# FOR MORE INFORMATION:
</div>
</div>
For questions or comments about the contest, see [Contacting the IOCCC](../contact.html).
+5 -3
View File
@@ -537,7 +537,7 @@ NOT</strong> exceed <strong>2503</strong>.</p>
Use mkiocccentry</a>.</p>
<div id="rule3">
<div id="rule3-register">
<h2 id="rule-3---register-for-the-contest">Rule 3 - Register for the contest</h2>
<h2 id="rule-3---register-for-the-ioccc">Rule 3 - Register for the IOCCC</h2>
</div>
</div>
<p>You <strong>MUST</strong> register, using a valid email address, in order to submit
@@ -553,7 +553,7 @@ to register! The judges are <strong>NOT</strong> responsible for delayed or lost
email or for those who wait until the last minute to try to register!</p>
<p>See <a href="../quick-start.html#enter">Entering the IOCCC: the bare minimum you need to know</a>.</p>
<p>See <a href="rules.html#rule8">Rule 8 - Submitting requirements</a>.</p>
<p>See <a href="guidelines.html#guideline-3---register">Guidelines for Rule 3 - Registering for the IOCCC</a>.</p>
<p>See <a href="guidelines.html#guideline-3---register">Guidelines for Rule 3 - Register for the IOCCC</a>.</p>
<div id="rule4">
<div id="rule4-required-files">
<h2 id="rule-4---required-files">Rule 4 - Required files</h2>
@@ -656,7 +656,7 @@ owner(s) to its use. If you submit <strong>ANY</strong> content that is owned by
<strong>MUST</strong> detail that ownership, i.e., who owns what, and document the permission
you obtained from them in your <code>remarks.md</code> file.</p>
<p>You are permitted to use tools to write your code.</p>
<p>See <a href="rules.html#rule-16-anonymous-judging">Rule 16 - Anonymous Judging</a>.</p>
<p>See <a href="rules.html#rule16-anonymous-judging">Rule 16 - Anonymous Judging</a>.</p>
<p>See <a href="guidelines.html#guideline-7---original-work">Guidelines for Rule 7 - Original Work</a>.</p>
<div id="rule8">
<div id="rule8-submitting-requirements">
@@ -796,8 +796,10 @@ variable.</p>
<p>See FAQ on “<a href="../faq.html#makefile_details">What are the detailed recommendations for a submission Makefile?</a>”.</p>
<p>See <a href="guidelines.html#guideline-15---building">Guidelines for Rule 15 - GNU Makefile compatibility</a>.</p>
<div id="rule16">
<div id="rule16-anonymous-judging">
<h2 id="rule-16---anonymous-judging">Rule 16 - Anonymous judging</h2>
</div>
</div>
<p>Your source code, data files, remarks, and program output <strong>MUST NOT</strong>
identify the author(s) of your code (unless you are <strong>Peter Honeyman</strong>
or pretending to be <strong>Peter Honeyman</strong>). In order to be impartial the
+5 -3
View File
@@ -128,7 +128,7 @@ Use mkiocccentry](#rule17-mkiocccentry).
<div id="rule3">
<div id="rule3-register">
## Rule 3 - Register for the contest
## Rule 3 - Register for the IOCCC
</div>
</div>
@@ -150,7 +150,7 @@ See [Entering the IOCCC: the bare minimum you need to know](../quick-start.html#
See [Rule 8 - Submitting requirements](rules.html#rule8).
See [Guidelines for Rule 3 - Registering for the IOCCC](guidelines.html#guideline-3---register).
See [Guidelines for Rule 3 - Register for the IOCCC](guidelines.html#guideline-3---register).
<div id="rule4">
@@ -292,7 +292,7 @@ you obtained from them in your `remarks.md` file.
You are permitted to use tools to write your code.
See [Rule 16 - Anonymous Judging](rules.html#rule-16-anonymous-judging).
See [Rule 16 - Anonymous Judging](rules.html#rule16-anonymous-judging).
See [Guidelines for Rule 7 - Original Work](guidelines.html#guideline-7---original-work).
@@ -486,8 +486,10 @@ See [Guidelines for Rule 15 - GNU Makefile compatibility](guidelines.html#guidel
<div id="rule16">
<div id="rule16-anonymous-judging">
## Rule 16 - Anonymous judging
</div>
</div>
Your source code, data files, remarks, and program output **MUST NOT**
identify the author(s) of your code (unless you are **Peter Honeyman**