博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编写高质量代码:改善c程序代码的125个建议》—— 建议14-1:尽量避免对未知的有符号数执行位操作...
阅读量:6367 次
发布时间:2019-06-23

本文共 1073 字,大约阅读时间需要 3 分钟。

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第2章,建议14-1,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议14-1:尽量避免对未知的有符号数执行位操作

在C语言中,如果在未知的有符号数上执行位操作,很可能会导致缓冲区溢出,从而在某些情况下导致攻击者执行任意代码,同时,还可能会出现出乎意料的行为或编译器定义的行为。

下面来看一个简单的示例,如代码清单2-3所示。

代码清单2-3 在未知的有符号数上执行位操作示例#include 
int main (void){ int x=0; int y=0x80000000; char buf[sizeof("128")]; x=sprintf(buf,"%u",y>>24); if(x==-1||x>=sizeof(buf)) { // 错误处理 } printf(buf); return 0;}

在代码清单2-3中,y>>24的执行结果为4294967168,而sizeof(buf)的结果为4。当我们将y>>24的结果值转换为字符串“4294967168”时,超出了buf范围,所以结果值无法完全存储在buf中。因此,在执行语句“x=sprintf(buf,"%u",y>>24)”时,sprintf方法在进行写操作时就会越过buf的边界,从而产生缓冲区溢出。

如果在编译器VC++中执行这段程序,将会产生如图2-4所示的错误报告。
在C99中,要修正这样的错误,最好利用snprintf方法来代替sprintf方法。因为snprintf方法最多从源串中复制n-1个字符到目标串中,然后再从后面加一个0。因此,如果目标串的大小为n,将不会产生
溢出。
当然,如果将变量y声明成为无符号类型,那么这种缓冲区溢出错误将不会发生,如代码清单2-4所示。

代码清单2-4 代码清单2-3的改进示例#include 
int main (void){ int x=0; unsigned int y=0x80000000; char buf[sizeof("128")]; x=sprintf(buf,"%u",y>>24); if(x==-1||x>=sizeof(buf)) { // 错误处理 } printf(buf); return 0;}

转载地址:http://zdgma.baihongyu.com/

你可能感兴趣的文章
几个常用且免费的接口
查看>>
jQuery文件上传插件 Uploadify更改错误提示的弹出框
查看>>
RHEL6下Apache与Tomcat整合
查看>>
Heartbeat+DRBD+MFS高可用
查看>>
要感谢那些曾经慢待你的人
查看>>
常见的global cache等待事件
查看>>
第 7 章 多主机管理 - 047 - 管理 Machine
查看>>
CentOS5和6的系统启动流程
查看>>
怎么看域客户端是否继承了组策略
查看>>
linux防止DDoS***
查看>>
6.4 Linked List 重做
查看>>
小米路由
查看>>
QT 学习 之 窗口拖拽 实现
查看>>
PHP的ftp文件,多文件上传操作类
查看>>
js中清空数组的方法
查看>>
python def说明
查看>>
Java根据IP获取国家省级地市信息
查看>>
自动安装系统及网络安装服务
查看>>
11g RAC 更改归档模式 ,归档文件存放在ASM 磁盘组
查看>>
Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
查看>>