# Official IOCCC rules
These rules are **OFFICIAL**.
Unless some significant problem turns up (such as a need to delay in
when the IOCCC will close, or some major bug is discovered) they will
remain **OFFICIAL** for this 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 rules. You might also find the FAQ in general useful, especially the
FAQ on "[how to enter the IOCCC](../quick-start.html#enter)".
**SUGGESTION**: Watch both the [IOCCC news](../news.html) and the [IOCCC
Mastodon](https://fosstodon.org/@ioccc) feed for the latest news about
any _mentions_ changes.
**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.
# The IOCCC open for submissions
See "[FAQ - How may I enter the IOCCC](../quick-start.html#enter)"
for information on how to register for the IOCCC, how to create a proper
bzip2 compressed tarball of your submission, and how to upload your
bzip2 compressed tarball to the IOCCC submit server.
# 29th International Obfuscated C Code Contest Official Rules
Copyright (c) 2025 Leonid A. Broukhis and Landon Curt Noll.
All Rights Reserved. Permission for personal, education or non-profit use is
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).
## Rules Version
These IOCCC Rules are version **29.15 2025-12-02**.
The | symbol
indicates a **change** from the previous IOCCC.
Because the **IOCCC29** rules was a substantial rewrite, only
**important changes** from **IOCCC28** have been marked.
Reminder: be SURE to read the [IOCCC guidelines](guidelines.html).
## Rule 0 - Dates
This IOCCC runs from `2025-12-03 20:25:12.045045 UTC` to `2026-03-13
17:19:23.293137 UTC`.
This contest will enter the [pending state](../faq.html#pending) on
`2025-12-03 20:25:12.045045 UTC`, allowing people to [register for the
IOCCC](register.html).
This contest will enter the [open state](../faq.html#open) on
`2025-12-15 18:21:24.273033 UTC`, allowing people to [upload
submissions](submit.html).
This contest will enter the [judging state](../faq.html#judging) on
`2026-03-13 17:19:23.293137 UTC`, when people will no longer be allowed
to upload submissions.
The above **dates and times may change _AT ANY TIME_** until the
[contest status](../status.html) is **open**.
The above timestamps are in "_YYYY-MM-DD HH:MM:SS.micros UTC_" format.
See [Entering the IOCCC: the bare minimum you need to
know](../quick-start.html#enter).
See
FAQ on "[How can I comment or make a suggestion on IOCCC rules,
guidelines and tools?](../faq.html#feedback)".
Your submission **MUST** be a C program.
See the [Guidelines for Rule 1 - C
program](guidelines.html#guideline1-c).
## Rule 2 - Size restrictions
`Rule 2` requires that your submission satisfy **BOTH** [Rule 2a
(Gross Size)](rules.html#rule2a) and [Rule 2b (Net
Size)](rules.html#rule2b).
During development this can be checked using `iocccsize(1)`:
```
iocccsize prog.c
```
See the [Guidelines for Rule 2 - Size
restrictions](guidelines.html#guideline2-size).
The overall maximum size of your `prog.c` program source **MUST NOT**
exceed **4993** bytes.
See [Entering the IOCCC: the bare minimum you need to
know](../quick-start.html#enter).
Check your source code using the latest official IOCCC size tool,
`iocccsize(1)`. The value printed **MUST NOT** exceed **2503**.
See [Rule 17 - Use mkiocccentry](#rule17-mkiocccentry).
## Rule 3 - Register for the IOCCC
You **MUST** register, using a valid email address, in order to submit
to the IOCCC. You may register while the contest is **pending** or
**open**.
A few days after registering, you'll receive your UUID username and
temporary password, which you **MUST** change within 14 days.
See [How to register for the IOCCC](register.html).
See [Entering the IOCCC: the bare minimum you need to
know](../quick-start.html#enter).
See [Guidelines for Rule 3 - Register for the
IOCCC](guidelines.html#guideline3-register).
## Rule 4 - Required files
Your submission **MUST** include at least these files: `Makefile`,
`prog.c`, `remarks.md`,`.info.json`, and `.auth.json`, the latter two
of which are generated by `mkiocccentry(1)`. See [Rule 17 - Use
mkiocccentry](#rule17-mkiocccentry).
At a **minimum** the following requirements apply. Additional
requirements may be imposed by `mkiocccentry(1)` updates that have yet
to be listed below:
* `.info.json` and `.auth.json` **MUST** be generated by
`mkiocccenty(1)` when packing a submission.
*
Before forming the tarball, `mkiocccentry(1)` will run `chksubmit(1)` on your
submission directory and if **ANY** problems are found (with `.auth.json`,
`.info.json` or **ANYTHING** else), your tarball will **NOT** be formed.
* The `Makefile`, `remarks.md`,`.info.json`, and `.auth.json`
**MUST** have a file size **greater than 0** and **MUST** have content. Note
that `mkiocccentry(1)` will check for file **size** but will **NOT** check for
content. On the other hand `chksubmit(1)` will check that the `.auth.json` and
`.info.json` are both valid JSON and are valid according to the IOCCC
requirements.
*
Your submitted source code **MUST** be called `prog.c`. When the
`Makefile` compiles your code, the executable (if applicable) **MUST**
be called `prog`. The `Makefile` may compile your source code into
other filenames as well, if you want.
*
As `prog`, `prog.alt`, `prog.alt.o`, `prog.o` may be created by your
`Makefile`, your submission **MUST NOT** include those files in your
**top** directory.
*
Your submission may **NOT** have any file that starts with `COPYING`,
`COPYRIGHT`, or `LICENSE` as those files are reserved by IOCCC.
*
Your submission may **NOT** have in the **top** directory:
`prog.orig.c`, `README.md` or `index.html` as those files are reserved
by the IOCCC.
*
Your submission may **NOT** have in the **top** directory any file that matches
a file glob pattern form `[0-9][0-9][0-9][0-9]_*.tar.bz2` as those files are
reserved by IOCCC.
*
Your submission may **ONLY** contain **regular** files and directories. Other
file types such as symlinks, sockets etc. are **NOT** allowed.
*
**All** directories **MUST** have permission mode of `0755`. All
files **MUST** have the file mode of `0444`, **EXCEPT** for files that
end in `.sh` which must have a mode of `0555`.
*
All files that end in `.md` **MUST** be in markdown format.
*
All filenames are treated as case insensitive. For example,
`REMARKS.MD`, and `Remarks.md`, and `remarks.md` are considered by
`mkiocccenty(1)` to be the **SAME** file. When preparing a submission
on a case sensitive filesystem, ensure that the submission will work on
a case insensitive filesystem.
**NOTE**: by 'top directory' we mean the directory with `prog.c`,
`Makefile`, `remarks.md` and the `mkiocccentry(1)` generated files
`.auth.json` and `.info.json` and **NOT** the `topdir` arg to
`mkiocccentry(1)`.
**NOTE**: `mkiocccentry(1)` will reject any directory which has
prohibited files.
The `remarks.md` and `Makefile` are explained in more detail in the
[Guidelines](guidelines.html).
See [IOCCC markdown guidelines](../markdown.html).
See [Rule 17 - Use mkiocccentry](rules.html#rule17-mkiocccentry).
See the
FAQ on "[What permissions may my files be and what if I need different
permissions?](../faq.html#file_perms)".
See the
FAQ on "[What are the detailed recommendations for a submission
Makefile?](../faq.html#makefile_details)".
See the [Guidelines on the mkiocccentry
toolkit](guidelines.html#mkiocccentry_toolkit).
## Rule 5 - Do NOT modify submitted files, filenames or parent directories
Your submission **MUST NOT** modify the filenames or content of any of
your original submission, such as `prog.c`, `Makefile`, or **ANY**
other supplied files. To modify files, your program can make a copy or
you can use the `Makefile` to setup working copies. Any working copies
**MUST** be cleaned up by the `Makefile` `clobber` target, so as to
restore the directory to its original state.
With the exception of the `/tmp` and the `/var/tmp` directories,
assuming the directory name or filename does **NOT** start with a `.`
(dot), your submission **MUST NOT** create or modify directories and
files **ABOVE** the current directory.
The `Makefile` `clobber` target **MUST** restore your submission to its
original form, including the removal of any created files and
directories.
Your code should be able to run under a [SUS
environment](https://pubs.opengroup.org/onlinepubs/9799919799/).
I am **NOT** a Rule, I am a `free(void *human);` ‼️
```
while (!(ioccc(rule(you(are(number(6)))))) {
ha(); ha(); ha();
}
```
See [Rule 19 - Prime](rules.html#rule19-prime).
## Rule 7 - Original Work
You, the author(s), **MUST** own the contents of your submission, **OR**, IF you
do **NOT** own the work, then you **MUST** have permission from the original
owner(s) to its use. If you submit **ANY** content that is owned by others, you
**MUST** detail that ownership, i.e., who owns what, and document in your
`remarks.md` the permission you obtained from them.
You are permitted to use tools to write your code.
See [Rule 16 - Anonymous Judging](rules.html#rule16-anonymous-judging),
and
[Guidelines for Rule 7 - Original
Work](guidelines.html#guideline7-original).
## Rule 8 - Submitting requirements
The submit server will accept submissions **ONLY** from those who have
registered and **ONLY** while the contest is open and **ONLY** after
you have changed your initial password.
The submit server places a total size limit of **3999971** bytes
**PER** submission.
Each account has ten (**10.000**) submission slots (**0..9)**.
Each submission slot should be annotated by the server as to whether it
was received, processed, malformed, etc. Please take note of any
errors, rectify, and resubmit.
In order to avoid potential packaging errors, it is **highly
recommended** to use `mkiocccentry(1)`, **AND** to check from time to
time the status on the submit server, to see if any tests run by the
server failed to validate your submission.
See
[Rule 3 - Registering for the IOCCC](rules.html#rule3-register),
[Rule 15 - GNU Makefile](rules.html#rule15-gnu-makefile),
and
[Rule 17 - Use mkiocccentry](rules.html#rule17-mkiocccentry).
See [Guidelines for Rule 8 - Submitting
requirements](guidelines.html#guideline8-submitting).
## Rule 9 - No interactive compiling allowed
Entries requiring human interaction to be initially compiled are **NOT**
permitted. However, see the [guidelines on rule
9](guidelines.html#guideline9-no-interactive) as you
**may** suggest alternative compilation steps to do something fun or
cute.
Each entry **MUST** automate the build process using `bash`, `gmake`,
`gcc` and/or `clang` and other commonly available tools under an [SUS
environment](https://pubs.opengroup.org/onlinepubs/9799919799/).
**NOTE**: any reference to `gmake(1)` can be any GNU Make compatible
tool.
**NOTE**: it is better to use the `${MAKE}` variable as then one may
override the `make` command.
**NOTE**: it is better to **NOT** modify `${CC}` in your Makefile as
this makes your program more portable.
See [Rule 15 - GNU Makefile](rules.html#rule15-gnu-makefile).
See [Guidelines for Rule 9 - No interactive compiling
allowed](guidelines.html#guideline9-no-interactive).
## Rule 10 - Program file permissions
Programs that require special privileges (`setuid(2)`, `setgid(2)`,
super-user, special owner, special group, etc.) are **HIGHLY
DISCOURAGED**. We do **NOT** guarantee these functions will behave as
you expect on our test platforms.
If your program needs special permissions you **MUST** document this
fact and explain why it is needed in your submission’s `remarks.md`
file, preferably close to the top, because `mkiocccentry(1)` will
**NOT** set those modes.
Furthermore, if you need a supplementary program that you include to
have these permissions, you will also have to explain this as well,
because these bits are **NOT** allowed in submissions and those bits
will **NOT** be copied by `mkiocccentry(1)` either.
See [Rule 4 - Required files](rules.html#rule4-required-files),
and
[Rule 5 - Do NOT modify files](rules.html#rule5-modifying-files).
## Rule 11 - Legal rule abuse
Legal abuse of the rules is **somewhat** encouraged, but comes with
risks. A submission that, in the opinion of the Judges, **violates**
the rules **WILL BE DISQUALIFIED**. Submissions that plan to abuse the
rules **MUST** justify why their rule abuse is legal (or interesting)
in the `remarks.md` file.
Submission packaging abuse will **NOT** be tolerated and for this reason,
amongst many other reasons, it is recommended that you use
`mkiocccentry(1)`. See also [Rule 17 - use
mkiocccentry](#rule17-mkiocccentry).
During development you can check your `prog.c` size limits using
`iocccsize(1)`, e.g., `iocccsize -v1 prog.c`. Overriding problems
detected by any of the IOCCC tools risks that the submission will be
rejected.
If you do submit a rule abusing or violating submission, then consider
also submitting an alternate version in a different submission server
slot that does **NOT** violate the rules in case your rule abuse excuse
is rejected.
**IMPORTANT**: If you do submit such an alternate non-rule abusing
version, **PLEASE** indicate that in your `remarks.md` file of your
non-rule abusing version so that the Judges don't think you uploaded a
duplicate into a wrong slot by mistake.
See [Guidelines for Rule 11 - Legal rule
abuse](guidelines.html#guideline11-abuse).
Use of UTF-8 is supported by `C11` standard and its updates and so too
by the IOCCC.
See [Guidelines for Rule 12 - UTF-8](guidelines.html#guideline12-utf8).
## Rule 13 - No carriage returns in prog.c
Any C source that fails to compile because lines contain
carriage-returns (CTRL+M, `\r`) in particular as part of DOS/Windows
style newlines might be rejected. Please do **NOT** put trailing
CTRL+M in `prog.c`, `Makefile`, or `remarks.md` files, but instead end
lines with Unix newline (line-feed, CTRL+J, `\n`).
You are permitted, in order to try and squeeze your `prog.c` under a
[Rule 2a Gross Size](rules.html#rule2a-gross-size) and/or [Rule 2b Net
Size](rules.html#rule2b-net-size) limits, to **NOT** end source with a
newline. If you need to do this, please document that in your
`remarks.md` file and if your compiler complains about this, document
this too and update your `Makefile` to account for this.
See [Guidelines for Rule 13 - No carriage returns in
prog.c](guidelines.html#guideline13-nocr).
## Rule 14 - Resubmitting lost submissions
Submissions that are substantially similar to previous winning IOCCC
entries are discouraged. See the
FAQ on "[What types of entries have been frequently submitted to the
IOCCC?](../faq.html#frequent-themes).
You are allowed to resubmit to a later contest, a submission that
didn't win the IOCCC. If you do so, then you would be **WELL ADVISED**
to try and enhance and improve your submission. If you do resubmit
something that didn't previously win, then you are encouraged to
mention this in your `remarks.md` file as this **sometimes** helps.
## Rule 15 - GNU Makefile
The `Makefile` **MUST** adhere to GNU Makefile syntax. It's highly
recommended that you copy the [Makefile.example](Makefile.example) as a
template, renaming it to `Makefile`. The primary target of the
`Makefile` **MUST** be `prog` and the source file is `prog.c`. The C
compiler and preprocessor **MUST** be invoked using `${CC}` and
`${CPP}` macros respectively.
The `clobber` target **MUST** clean and restore the submission
directory tree to its original state, such as removing temporary files
or any modified data files. Don't assume that `git` tool chain is
installed, i.e. do **NOT** expect `git clean -f` to work. To be clear:
do **NOT** use `git` to clean out files as this **WILL** cause problems
in the winner repo!
The `Makefile` **MUST** use a syntax that is compatible with `bash(1)`
and GNU `make(1)`. You are encouraged to use `SHELL= bash` in your
`Makefile`; please add a space between the `=` and the value such as:
```
SHELL= bash
```
Assume that commands commonly found in [Single UNIX
Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification)
environments and systems are available in the search
`$PATH`.
Avoid command options that aren't part of
[SUS](https://en.wikipedia.org/wiki/Single_UNIX_Specification), such as
GNU long name options (such as `--example`) or extensions like `grep
-P`.
Do **NOT** assume that `.` (current directory) is in the `$PATH`
environment variable.
See [Rule 4 - Required files](rules.html#rule4-required-files).
See
FAQ on "[What are the detailed recommendations for a submission
Makefile?](../faq.html#makefile_details)".
See [Guidelines for Rule 15 - GNU
Makefile](guidelines.html#guideline15-gnu-makefile).
## Rule 16 - Anonymous judging
Your source code, data files, remarks, and program output **MUST NOT**
identify the author(s) of your code (unless you are **Peter Honeyman**
or pretending to be **Peter Honeyman**). In order to be impartial the
[Judges](https://www.ioccc.org/judges.html) do **NOT** know who is
submitting programs to the IOCCC until final selection is made, and
**only** submissions that won.
Even if you are a past winner, you **MUST NOT** reveal your identity
deliberately or by accident anywhere in your submission. **_Failure to
comply may result in the submission being disqualified_**.
## Rule 17 - Use `mkiocccentry`
**TL;DR**: use `mkiocccentry(1)` to package your submission.
The files, directories, and paths **MUST** conform to the limits
imposed by `mkiocccentry(1)`, including but **NOT** limited to, their
names, count, path length, directory tree depth, and permissions.
The submission tree may have at most **13** directories and maximum
directory depths of **4**. The maximum number of files, excluding
`prog.c`, `remarks.md`, `Makefile`, `prog.alt.c`, `try.sh`,
`try.alt.sh`, `.info.json` and `.auth.json` is **31**.
The maximum file-path component is **38** and the maximum
path length is **60**.
The submission **MUST** be a `.txz` compressed tarball (i.e., tarball
compressed by `xz(1)`) **as constructed by** `mkiocccentry(1)`, which
**MUST** be within **[1..3999971]** bytes in size.
The tarball **MUST** be a **v7 format** tarball, and any supplementary
tarballs you provide **MUST ALSO** be **v7 format**.
The sum of all file lengths, after unpacking from the tarball, **MUST**
be less than `27651*1024` (**28314624**) bytes.
The submission **MUST** pass all `txzchk(1)` checks, and the tarball
filename **MUST** pass all `fnamchk(1)` checks as well.
You may **NOT** submit a tarball created by the `-d`, `-e` **OR** by
the `-s seed` options of `mkiocccentry(1)`.
The unpacked submission directory **MUST** pass the checks performed by
the minimum required version of `chksubmit(1)`.
Submissions may **NOT** use a [mkiocccentry
toolkit](https://github.com/ioccc-src/mkiocccentry) command line
options that are labelled as "**for TESTING purposes**", **OR**
labelled as "**for the use by the IOCCC judges only**", in their
respective man pages.
Submissions may **ONLY** use [mkiocccentry
toolkit](https://github.com/ioccc-src/mkiocccentry) command lines that
confirm to the command's `-h` "_print help message_", again
notwithstanding the options for testing and the IOCCC judges.
The `prog.c` file should pass the [Rule 2 - Size
restrictions](rules.html#rule2-size) checks performed by
`iocccsize(1)`.
The `.auth.json` and `.info.json` files **MUST** be exactly
what the minimum required `mkiocccentry(1)` version generates.
Any submission that fails to pass the checks performed by the minimum
required version of the [mkiocccentry
toolkit](https://github.com/ioccc-src/mkiocccentry) **WILL be
rejected**!
See [Rule 4 - Required files](rules.html#rule4-required-files).
See the
FAQ on "[What is the mkiocccentry tool, how do I obtain it and how do I
use it?](../faq.html#mkiocccentry)".
See the [Guidelines for Rule 17 - Use
mkiocccentry](guidelines.html#guideline17-mkiocccentry).
## Rule 18 - Submission license
The entirety of your submission **MUST** be submitted under the
following license:
[CC BY-SA 4.0 DEED Attribution-ShareAlike 4.0
International](https://creativecommons.org/licenses/by-sa/4.0/).
See [Rule 7 - Original Work](rules.html#rule7-original-work).
This 19th rule, while prime, is reserved for future abuse 😁.
Additional rules, both humorous and otherwise, may be added below this
rule in future contests.
See [Rule 6 - Free Rule](rules.html#rule6-free-rule).
## Further Reading
Please read the [Guidelines](guidelines.html) next for further
commentary on these rules.
Read the
FAQ on "[Entering the IOCCC: the bare minimum you need to
know](https://www.ioccc.org/quick-start.html#enter)"
for an overview of how to enter the contest.
See also the [FAQ](../faq.html) in general.
And now [for something completely different](guidelines.html#fun).
Consider joining the [IOCCC Discord
Server](https://discord.com/invite/Wa42Qujwnw) for discussions about
The Rules, questions for the Judges, and `C` in general.
Leonid A. Broukhis
chongo (Landon Curt Noll) /\\cc/\\