vsnprintf的陷阱
今天修改bug,发现别人写的代码,vsnprintf使用的不对导致出现bug了。
int vsnprintf(char* str, size_t size, const char* format, va_list ap);函数说明
1. char *str [out],把生成的格式化的字符串存放在这里.2. size_t size [in], str可接受的最大字符数 [1] (非字节数,UNICODE一个字符两个字节),防止产生数组越界.3. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。4.va_list ap [in], va_list变量. va:variable-argument:可变参数函数功能:将可变参数格式化输出到一个字符数组。用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。返回值:执行成功,返回最终生成字符串的长度,
若生成字符串的长度大于size,则将字符串的前size个字符复制到str,同时将原串的长度返回(不包含终止符);
执行失败,返回负值,并置errno.
PS:这里有2个地方需要注意
第一是size这个参数的类型为无符号数,
如果使用的时候直接用MAX_LENG - msglen做参数的话,如果变负数的话,那作为无符号数就非常大了。
第二是这个函数的返回值。
若生成字符串的长度大于size,则将字符串的前size个字符复制到str,
同时将原串的长度返回(不包含终止符),这里原串可能大于size,
如果直接使用msglen += vsnprintf(msg + msglen, MAX_DBGMSG_LEN - msglen, format, ap);就出现数组越界了。
错误示例如下
错误用法va_start(ap, format);
msglen += vsnprintf(msg + msglen, MAX_DBGMSG_LEN - msglen, format, ap);
va_end(ap);当原串超过msg的长度的时候,就出现数组越界的问题了。
vsnprintf的陷阱相关推荐
- stetho 调试数据库_stetho是适用于android应用程序的最佳调试工具
stetho 调试数据库 As Android developers, our development life often involves integrating API or web servi ...
- Golang 要注意的陷阱和常见错误
原文: 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs 翻译: Go的50度灰:新Golang开发者要 ...
- typedef的四个用途和两大陷阱
typedef的四个用途和两个陷阱 --------------------------------- 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: c ...
- JS中8个常见的陷阱
译者按: 漫漫编程路,总有一些坑让你泪流满面. 原文: Who said javascript was easy ? 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原 ...
- 跨越企业的“中等收入陷阱”
在国际经济学中,有一个"中等收入陷阱"的概念,含义为:新兴市场国家突破人均GDP1000美元的"贫困陷阱"后,很快会奔向1000美元至3000美元的" ...
- 《C陷阱与缺陷》一导读
前 言 C陷阱与缺陷 对于经验丰富的行家而言,得心应手的工具在初学时的困难程度往往要超过那些容易上手的工具.刚刚接触飞机驾驶的学员,初航时总是谨小慎微,只敢沿着海岸线来回飞行,等他们稍有经验就会明白这 ...
- c专家编程/c陷阱_如何避免常见的初学者陷阱并像专家一样开始编码
c专家编程/c陷阱 by Dmitri Grabov 德米特里·格拉波夫(Dmitri Grabov) 如何避免常见的初学者陷阱并像专家一样开始编码 (How to avoid common begi ...
- Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误
这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...
- Linux0.00内核为什么要自己设置0x80号陷阱门来调用write_char过程?
我一开始没注意这个问题,只是通过陷阱门觉得很绕弯子,为何不在3级用户代码里直接调用write_char,今天自己写程序想用call调用代码段,才发现了大问题.我写了个类似于write_char的过程, ...
最新文章
- 为什么Scrum模式适合软件开发?
- 使用 TestFlight 进行项目内测
- oracle游标应用 sys_refcursor 和 cursor比较
- Qt Creator和Visual Studio双环境开发技能攻略
- 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(2)
- 创建sdcard.img时,提示permission dennid
- 《PWM整流器及其控制》读书笔记-第二章-PWM整流器拓扑结构及原理
- 远程清卡失败服务器内部错误,​航天信息远程清卡失败怎么处理
- item_search_img - 拍立淘搜索淘宝商品(淘宝API)
- 八个研发物联网产品的重要问题
- python 将url 相对地址转绝对地址
- 计算机被填充背景花束纹理在那,为艺术字设置纹理填充的两种方法
- Acess错误:文件共享锁定数溢出
- React — input标签输入中文的拼音时候会触发onChange事件解决
- 1w字详解从破解某定设计网站谈前端明暗水印(推荐收藏)
- TRECA 崔佧智能低代码开发使用说明
- 水电表、工控、医用电子设备等超低功耗段码LCD液晶显示驱动IC-VKL144A/B,TSSOP48/QFN48,工作电流<10微安,可完全兼容替代PCF8551、MCP144、BU9792、9B92等
- JDK API(SE8)(部分System,Math,Integer类)
- 名编辑电子杂志大师教程 | 名编辑电子杂志大师能制作高清电子期刊吗?
- 学习笔记:RTC时钟