【发布时间】:2016-04-18 07:34:27
【问题描述】:
我看到a snippet of code on CodeGolf 打算用作编译器炸弹,其中main 被声明为一个巨大的数组。我尝试了以下(非炸弹)版本:
int main[1] = { 0 };
在 Clang 下似乎编译得很好,在 GCC 下只有一个警告:
警告:'main' 通常是一个函数 [-Wmain]
生成的二进制文件当然是垃圾。
但是为什么它会编译呢? C规范甚至允许吗?我认为相关的部分说:
5.1.2.2.1 程序启动
程序启动时调用的函数名为main。实现没有声明这个函数的原型。它应该使用 int 的返回类型并且没有参数 [...] 或使用两个参数 [...] 或以其他一些实现定义的方式来定义。
“其他一些实现定义的方式”是否包含全局数组? (在我看来,规范仍然指的是一个函数。)
如果不是,它是编译器扩展吗?还是工具链的一个功能,用于其他目的,他们决定通过前端提供它?
【问题讨论】:
-
它不编译。 ISO C 禁止零大小的数组。
-
C 规范不允许。编译器通常会实现规范未涵盖的内容。
-
相关问题:How can a program with a global variable called main instead of a main function work?。我认为也受到了 codegolf 问题的启发。
-
@M.M 特别是Malbolge的情况