程序员

1153

最短的崩溃程序(C语言版)

2013-6-3 15:40| 发布者: liio| 评论: 5

想写个崩溃的C语言小程序,看起来是个奇怪的主意,不过在我曾经教过的一门实验课上,这是作业之一!实际上,这是一件非常有教学意义的事情。

通常学生们要么尝试反向引用一个非法地址,要么就是除0.除0会引发SIGFPE信号(浮点异常)。这里有一个小例子程序,使用除零方法来使之崩溃:

1
2
3
4
int main()
{
    return 1/0;
}

我们也可以删掉return关键字,但是当我这么做的时候gcc不会为这些语句生成可执行代码,即便优化选项被disable掉了。我们还可以通过把上面的语句改成赋值语句,使上面的代码改变一些特征:

1
2
3
4
5
i;
int main()
{
    i=1/0;
}

注意我声明了一个没有类型的i。这样的代码在C89标准里是有效的,因为所有的声明都有隐形的缺省类型int。在C99和其他一些C标准里这是一个错误。假定我们写的是C89代码,那么我们甚至可以使用隐形int来声明main函数:

1
2
3
4
5
i;
main()
{
    i=1/0;
}

那是相当短的代码了 — 如果我们不把用于缩进的空格计算进来,只有16个字符。然而,我们还可以做得更好!

当C程序在编译的时候,编译器会产生一个或更多对象文件,文件里有对于用到的库和全程对象(函数和变量)的符号索引。然后这些对象文件会被进行链接,这时符号索引被地址所代替,就产生了一个可执行文件。

编译器在一个对象文件里提供了一个调用main函数的入口点。调用main函数意味着我们试图执行在存储在main函数链接的位置所对应地址里的指令。

有趣的是,链接器对于不同对象的类型是没有概念的,它只知道它们的地址。所以,如果我们用一个常规的全程变量替换main函数,编译器会高兴地build对象文件,因为它不关心对象main的类型是什么;链接器也会高兴地链接它,因为它只关心main函数对应的地址。


鲜花

握手

雷人

路过

鸡蛋
游客 2017-10-23 01:52
Sildenafil En Ligne 120 Mgachat De Kamagra Buy Phenagran  <a href=http://cialgeneri.com>cialis</a> Does Alchohol Effect Amoxicillin ...
游客 2017-10-18 03:51
Viagra Rezeptfrei Expressversand Propecia Para El Pelo  <a href=http://leviinusa.com>buy levitra on line</a> Levitra Vergessen Low C ...
游客 2017-10-13 04:25
Adult Dosing Amoxicillin Priligy Forum 2010  <a href=http://genericcial.com>cialis</a> Usa Pills Viagra
游客 2017-10-6 09:34
Priligy Acquistare In Italia Real Viagra Pfizer  <a href=http://mailordervia.com>viagra</a> Amoxicillan Without A Prescription Ciali ...
游客 2017-10-4 00:59
500 Keflex Mg Buy Now Online Viagra  <a href=http://cheapviasales.com>viagra</a> Priligy Mexico Venta Achat Viagra Pfizer France
验证问答 换一个 验证码 换一个

查看全部评论(5)

Archiver|Rerede.com     

GMT+8, 2017-10-23 12:14

Powered by R-Team X2

© 2011-2012 Rerede.com.

回顶部