UNIX系统编程笔记

 
第一章
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,…);
 
函数永远也不能自己退出,而是应该向调用它的程序报告错误。函数内部的错误消息在调试阶段可能很有用,但通常不应该出现在最终版本中。处理调试信息有一种很好的方法:将调试打印语句包含在一个条件编译块中,这样,在需要的时候可以将其重新激活。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值