介绍
您可能熟悉zip炸弹,XML炸弹等。简单来说,它们是(相对)小文件,当用纯软件解释时,它们会产生巨大的输出。这里的挑战是以同样的方式滥用编译器。
挑战
编写一些占用512个字节或更少字节的源代码,并将其编译成一个占用最大可能空间的文件。最大的输出文件胜出!
规则
好的,因此有一些重要的说明,定义和限制。
- 编译的输出必须是ELF文件,Windows Portable可执行文件(.exe)或JVM或.Net的CLR的虚拟字节码(如果需要,其他类型的虚拟字节码也可能没问题)。更新:Python的.pyc / .pyo输出也算在内。
- 如果不能将您的选择语言直接编译为这些格式之一,则也可以先进行编译再进行编译(更新:只要您从未使用同一语言多次,就可以多次进行编译)。
- 您的源代码可以包含多个文件,甚至可以包含资源文件,但是所有这些文件的总大小不能超过512个字节。
- 除了源文件和选择语言的标准库之外,您不能使用任何其他输入。如果支持静态链接标准库,则可以。具体来说,没有第三方库或OS库。
- 必须可以使用一个或多个命令来调用您的编译。如果在编译时需要特定的标志,则这些标志将计入您的字节数限制(例如,如果您的编译行是
gcc bomb.c -o bomb -O3 -lm
,则将计算-O3 -lm
部分(7字节))(请注意,不计入初始前导空间)。 - 仅当预处理器是您语言的标准编译选项时,才允许使用预处理器。
- 环境取决于您,但是为了使此可验证性感兴趣,请坚持使用最新的(即可用的)编译器版本和操作系统(并明确指定要使用的版本)。
- 它必须编译时没有错误(警告是可以的),并且崩溃会使编译器不起作用。
- 您的程序实际执行的操作无关紧要,尽管它不可能是恶意的。它甚至不必启动。
例子1
C程序
main(){return 1;}
Apple LLVM version 7.0.2 (clang-700.1.81)
在OS X 10.11(64位)上编译:
clang bomb.c -o bomb -pg
产生一个9228字节的文件。源的总大小为17 + 3(对于-pg
)= 20字节,这很容易在大小限制内。
例子2
Brainfuck程序:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
用awib转换为c:
./awib < bomb.bf > bomb.c
然后Apple LLVM version 7.0.2 (clang-700.1.81)
在OS X 10.11(64位)上进行编译:
clang bomb.c
产生一个8464字节的文件。此处的总输入为143个字节(因为@lang_c
awib的默认设置是不需要将其添加到源文件中,并且两个命令中都没有特殊标志)。
还要注意,在这种情况下,临时的bomb.c文件为802字节,但这不会计入源大小或输出大小。
最后说明
如果实现了超过4GB的输出(也许有人找到了一个完整的预处理器),那么竞争将是争夺产生至少该大小文件的最小源(测试提交太大的文件是不切实际的) 。