The IOCCC is closed
The IOCCC is NOT accepting new submissions at this time. See the IOCCC winning entries page for the entries that have won the IOCCC in the past.
These rules 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” as well as our FAQ on “about asking questions” about these rules. You might also find the FAQ in general useful, especially the FAQ on “how to enter the IOCCC”.
Watch both the IOCCC status page and the @IOCCC mastodon feed for information about future IOCCC openings.
HINT to mastodon users: You may wish to refresh the @IOCCC mastodon feed page and/or mastodon app from time to time to view IOCCC mastodon updates.
30th International Obfuscated C Code Contest Official Rules
Copyright (c) 2026 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.
Rules Version
These IOCCC Rules are version 30.01 2026-09-18.
Reminder: be SURE to read the IOCCC guidelines.
Rule 0 - Dates
The above dates and times may change AT ANY TIME until the contest status 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.
See FAQ on “How can I comment or make a suggestion on IOCCC rules, guidelines and tools?”.
Rule 1 - C program
Your submission MUST be a C program.
See the Guidelines for Rule 1 - C program.
Rule 2 - Size restrictions
Rule 2 requires that your submission satisfy BOTH Rule 2a
(Gross Size) and Rule 2b (Net
Size).
During development this can be checked using iocccsize(1):
iocccsize prog.c
See the Guidelines for Rule 2 - Size restrictions.
Rule 2a - Gross 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.
Rule 2b - Net Size
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.
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.
See Entering the IOCCC: the bare minimum you need to know.
See Guidelines for Rule 3 - Register for the IOCCC.
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.
At a minimum the following requirements apply. Additional
requirements may be imposed by mkiocccentry(1) updates that have yet
to be listed below:
.info.jsonand.auth.jsonMUST be generated bymkiocccenty(1)when packing a submission.Before forming the tarball,
mkiocccentry(1)will runchksubmit(1)on your submission directory and if ANY problems are found (with.auth.json,.info.jsonor ANYTHING else), your tarball will NOT be formed.The
Makefile,remarks.md,.info.json, and.auth.jsonMUST have a file size greater than 0 and MUST have content. Note thatmkiocccentry(1)will check for file size but will NOT check for content. On the other handchksubmit(1)will check that the.auth.jsonand.info.jsonare both valid JSON and are valid according to the IOCCC requirements.Your submitted source code MUST be called
prog.c. When theMakefilecompiles your code, the executable (if applicable) MUST be calledprog. TheMakefilemay compile your source code into other filenames as well, if you want.As
prog,prog.alt,prog.alt.o,prog.omay be created by yourMakefile, your submission MUST NOT include those files in your top directory.Your submission may NOT have any file that starts with
COPYING,COPYRIGHT, orLICENSEas those files are reserved by IOCCC.Your submission may NOT have in the top directory:
prog.orig.c,README.mdorindex.htmlas 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.bz2as 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 of0444, EXCEPT for files that end in.shwhich must have a mode of0555.All files that end in
.mdMUST be in markdown format.All filenames are treated as case insensitive. For example,
REMARKS.MD, andRemarks.md, andremarks.mdare considered bymkiocccenty(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.
See IOCCC markdown guidelines.
See Rule 17 - Use mkiocccentry.
See the FAQ on “What permissions may my files be and what if I need different permissions?”.
See the FAQ on “What are the detailed recommendations for a submission Makefile?”.
See the Guidelines on the 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.
Rule 6 - Free Rule
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.
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.
See Rule 16 - Anonymous Judging, and Guidelines for Rule 7 - Original Work.
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 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, Rule 15 - GNU Makefile, and Rule 17 - Use mkiocccentry.
See Guidelines for Rule 8 - Submitting requirements.
Rule 9 - No interactive compiling allowed
Entries requiring human interaction to be initially compiled are NOT permitted. However, see the guidelines on rule 9 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.
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 Guidelines for Rule 9 - No interactive compiling allowed.
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, and Rule 5 - Do NOT modify 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.
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.
Rule 12 - UTF-8
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.
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 and/or Rule 2b 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.
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?.
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 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
environments and systems are available in the search
$PATH.
Avoid command options that aren’t part of
SUS, 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 FAQ on “What are the detailed recommendations for a submission Makefile?”.
See Guidelines for Rule 15 - GNU Makefile.
Rule 16 - Anonymous judging
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 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 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 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 WILL be rejected!
See the FAQ on “What is the mkiocccentry tool, how do I obtain it and how do I use it?”.
See the Guidelines for Rule 17 - Use 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.
Rule 19 - Prime
See Rule 6 - Free Rule.
Further Reading
Please read the Guidelines next for further commentary on these rules.
Read the FAQ on “Entering the IOCCC: the bare minimum you need to know” for an overview of how to enter the contest.
See also the FAQ in general.
And now for something completely different.
Consider joining the IOCCC Discord
Server for discussions about
The Rules, questions for the Judges, and C in general.
Leonid A. Broukhis chongo (Landon Curt Noll) /\cc/\
