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. linux之测试硬盘速度篇

    作业三:dd命令测试硬盘速度 [root@localhost 桌面]# dd if=/dev/sdc2 of=/a.txt bs=2M count=2 记录了0+1 的读入 记录了0+1 的写出 10 ...

  2. sql 索引笔记--索引组织结构

    非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储. 非聚集索引的叶层是由索引页而不是由数据页组成. 既可以使用聚集索引来为表或视 ...

  3. 【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 Flow Free is a puzzle that is played on a 2D grid of cells, with some ...

  4. IDEA 下载 和 安装 22

    1. IDEA 下载 网址     pttps://www.jetbrains.com IDEA      优点  :高度集成企业软件工程的概念(svn, git) 缺点: 破解存在在法律风险 ; E ...

  5. 201771010134杨其菊《面向对象程序设计java》第八周学习总结

    第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...

  6. flask 跨域问题

    在Flask开发RESTful后端时,前端请求会遇到跨域的问题.下面是解决方法.Python版本:3.5.1 下载flask_cors包 pip install flask-cors使用flask_c ...

  7. pygame 笔记-1 按键控制方块移动

    背景:家里的娃慢慢长大了,准备教一些儿童入门的编程知识,研究了一阵麻省理工的scratch 2 虽然不错,但是功能有限,很多高级点的东西玩不出来.所以就有了这一系列,先提前自学一下,顺便拿来练手pyt ...

  8. c++中函数的参数传递,内联函数和默认实参的理解

    1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...

  9. jQuery插件备忘

    jQuery BlockUI Plugin  遮罩插件                                                                          ...

  10. Error-MVC: “/”应用程序中的服务器错误。

    ylbtech-Error-MVC: “/”应用程序中的服务器错误. 1.返回顶部 1. “/”应用程序中的服务器错误. 运行时错误 说明: 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁 ...