博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 使用不安全的sprintf函数,存储字符越界导致程序莫名崩溃问题
阅读量:6957 次
发布时间:2019-06-27

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

linux c++编程

问题背景

在处理一个公共模块的代码中,其中有以下代码片段

1 //代码片段-组合一组字符串并存放到szSignKey数组中2 char szSignKey[256] = {
0}; sprintf(szSignKey, "userid&%u&version&%s&msg_body&%s&%s", uiUserID, strVersion.c_str(), strMsgBody.c_str(), SIGN_KEY);
strMsgBody是一组json格式的字符串,里面会根据协议请求传入不同数据的json格式字符串。 当strMsgBody请求的字符串过大,导致要存入szSignKey数组中的字符串超过255个时,会导致字符数组越界,超出的字符会在数组后面的内存空间中存储。 但是这个问题不会马上暴露出来,printf szSignKey的时候,还是会输出完整的越界字符串数组。但是在函数执行完return后,析构函数内的局部变量的时候导致程序崩溃。 使用gdb调试的时候,显示的也是一些其他临时对象析构导致崩溃,无法找到真正的崩溃原因。 问题原因: sprintf函数是不安全的c 字符处理函数,它在写字符串到字符数组时不会考虑字符数组的大小,当要存储的字符超过数组长度时,会把超出的字符写在数组后面的内存空间中,导致字符数组存储越界。 类型的C函数还有strcpy()等 解决办法: 使用安全的字符处理函数strncpy()、 snprintf()等。使用安全的字符处理函数会要求写入字符数粗的最大长度参数,超出的部分不会写入到数组中。 上面的sprintf代码可以修改成
1 char szSignKey[256] = {
0}; snprintf(szSignKey,sizeof(szSignKey),"userid&%u&version&%s&msg_body&%s&%s", uiUserID,strVersion.c_str(),strMsgBody.c_str(), SIGN_KEY);

  超出的字符会被截断掉,不会导致字符数组越界问题。

 

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

你可能感兴趣的文章
iptables表的备份和恢复、firewalld的9个zone、zone操作、service操作
查看>>
网友精选25个Java试题分享
查看>>
网络工程师必备的好帮手usb转console调试线
查看>>
加密文件系统EFS
查看>>
怎样禁止修改ip地址
查看>>
Filebeat的Registry文件解读
查看>>
Iphone H5上传照片被旋转
查看>>
深入理解Java中的组合和继承
查看>>
Spring - constructor-arg和property的使用示例
查看>>
如何查看CentOS版本方法
查看>>
puppet之master/agent模型详解
查看>>
我的友情链接
查看>>
JVM 数据存储介绍及性能优化
查看>>
Objective-C浅拷贝和深拷贝
查看>>
weblogic集群安装文档
查看>>
VMware SDS 之四:VSAN的技术细节
查看>>
Eager thick vs Lazy thick disk performance
查看>>
aix 主机信息的查看
查看>>
日志框架_Index
查看>>
java安全沙箱(一)之ClassLoader双亲委派机制
查看>>