linux c++编程

问题背景

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

 //代码片段-组合一组字符串并存放到szSignKey数组中
char szSignKey[] = {}; 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代码可以修改成
 char szSignKey[] = {};                                                                                                     
snprintf(szSignKey,sizeof(szSignKey),"userid&%u&version&%s&msg_body&%s&%s", uiUserID,strVersion.c_str(),strMsgBody.c_str(), SIGN_KEY);

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

												

linux 使用不安全的sprintf函数,存储字符越界导致程序莫名崩溃问题的更多相关文章

  1. linux c语言 fork() 和 exec 函数的简介和用法

    linux c语言 fork() 和 exec 函数的简介和用法   假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<std ...

  2. Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考

    操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...

  3. php sprintf 函数的用法

    sprintf() 函数把格式化的字符串写入变量中. arg1.arg2.++ 参数将被插入到主字符串中的百分号(%)符号处.该函数是逐步执行的.在第一个 % 符号处,插入 arg1,在第二个 % 符 ...

  4. sprintf()函数的用法

    Visual C++ sprintf()函数用法 转:http://blog.csdn.net/masikkk/article/details/5634886 在将各种类型的数据构造成字符串时,spr ...

  5. sprintf函数

    sprintf函数用法举例 #include<stdio.h> int main() { //1.连接字符串 char a1[] = {'A', 'B', 'C', 'D', 'E', ' ...

  6. 【Linux程序设计】之环境系统函数综合实验

    这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的.贴出来纯粹是聊胜于无. 实验题目:Linux环境下系统函数综合实验 实验目的:熟悉并掌握Linux环境下数学函 ...

  7. arduino上使用sprintf()函数输出float值出错

    如果尝试使用sprintf()函数在arduino上进行对float指转换为一个字符串的话,你会发现,it doesn't work.弄了很久,还以为是没学c++的原因.其实在arduino上,这个函 ...

  8. linux网络编程九:splice函数,高效的零拷贝

    from:http://blog.csdn.net/jasonliuvip/article/details/22600569 linux网络编程九:splice函数,高效的零拷贝 最近在看<Li ...

  9. sprintf函数php的详细使用方法

    PHP sprintf() 函数 先说下为什么要写这个函数的前言,这个是我在微信二次开发的一个token验证文档也就是示例文档看到的一个函数,当时非常不理解,于是查了百度,但是很多结果都很笼统,结果也 ...

随机推荐

  1. keepalived+mysql backup服务器可ping通过vip但telnet vip+3306失败问题

    环境: OS:CentOS 7_X64 数据库:mysql-5.7 MASTER:192.168.119.23 BACKUP:192.168.119.24 VIP:192.168.119.138 ke ...

  2. webpack常用loader和plugin及打包速度优化

    优化 或 也可以用: 备用: 慎用的配置,用的不好会增加打包时间: 代码丑化插件:

  3. 小甲鱼Python第三讲课后习题

    0.以下哪个变量的命名不正确?为什么? A:MM_520 B:_MM520_ C:520_MM D:_520MM 变量 命名:以字母.下划线.数字组成,以字母.下划线开头 1.除了使用反斜杠(\)进行 ...

  4. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  5. nginx代理后,获取request的ip

    应用程序部署上线,一般都会用nginx之类的来进行反向代理,而不是直接访问tomcat之类的容器. 这时候如果用平时的获取ip的代码,就只会获取到nginx所在服务器的ip, 就失去了本身的意义. 今 ...

  6. java/javac命令行如何同时引用多个包;错误 TypeError: 'JavaPackage' object is not callable 的含义

    出现这类错误提示:'JavaPackage' object is not callable,可以看下所引用的jar包或者class文件是否在java的路径搜索范围内 命令行模式下:javac可以编译* ...

  7. docker dcm4chee

    The received images should show up in the UI of the Archive at http://localhost:8080/dcm4chee-arc/ui ...

  8. SQLAlchemy——获取某列为空的数据

    session.query(StockAllInfo).filter( StockAllInfo.ts_code == tsCode and StockAllInfo.py_code==None).a ...

  9. [原创]Delphi XE10 dxLayoutControl 控件应用指南

    DevExpress VCL套件是一套非常强大的界面控件,可惜关于Delphi开发方面的说明太少,有些控件使用起来一头雾水,不知从何下手.本节详细介绍在Delphi Xe10 Seattle中如何利用 ...

  10. 使用AShot进行网页全页截图

    import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.Chrom ...