第一章
1、下面的代码有缓冲区溢出的可能
Char buf[80];
Printf(“Enter your first name ”);
Scanf(“%s”,buf);
下面的代码段不会产生缓冲区溢出:
Char buf[80];
Printf(“Enter your first name ”);
Scanf(“%79s”,buf);
缓冲区溢出的后果:程序通常都在程序栈上分配自动变量。在典型系统中,栈都是从高端内存向低端内存扩展的。调用一个函数时,栈的低端部分包括传递的函数和返回地址。栈中较高的部分(内存地址比较小的部分)用来存放局部自动变量。栈可以用来存储其他值,也可能包含根本不为程序所用的间隙。一个很重要的事实是:每次函数调用的返回地址通常都存储在自动变量后面的内存中(存储在地址比较大的内存中)。
当程序向栈中变量的范围之外写入时,会发生缓冲区溢出。额外的字节可能会重写未使用的空间、其他变量、返回地址或该程序不能合法访问的其他内存。结果可能是没什么影响,也可能会造成程序崩溃、信息转储以及不可预测的行为。
默认情况下,系统会对写入stdout(即函数printf()的默认输出)进行缓冲,这样,特定的消息可能不会在printf返回之后立即出现。写入stderr的消息不会被缓冲,而是立即写出。因此,对于调试消息总是应该使用stderr,即:fprintf(stderr,…);