这俩函数乃是 sprintf 与 vsprintf 的安全版本,因为是安全函数,于是想当然的使用。直到最近遇到的一个日志组件bug,调试了许久才发现原来是在使用这俩函数时,对溢出情况下,返回值的错误处理导致的,这里写了一个小测试。

测试代码及输出如下:

#include <iostream>
#include <stdarg.h>void TestVsnprintf(const char* format, ...)
{char* buff2 = new char[1024]{ 0 };va_list va;va_start(va, format);int len2 = vsnprintf(buff2, 5, format, va);va_end(va);printf("buff2:[%s], len:[%d]\n", buff2, len2);
}int main()
{char* buff1 = new char[1024]{ 0 };int len1 = snprintf(buff1, 5, "hello world!");printf("buff1:[%s], len:[%d]\n", buff1, len1);TestVsnprintf("hello world!");
}
buff1:[hell], len:[12]
buff2:[hell], len:[12]

由此可见,snprintf 与 vsnprintf 在处理内存溢出的情况时,虽然对写入的内容做了截断处理,但是返回值却是包含溢出内容的值,如果在连续使用 snprintf 或者 vsnprintf 对一块内存进行写入的时候,使用了这个返回值而没有进行检查的话,就可能会导致内存越界错误。

snprintf 与 vsnprintf相关推荐

  1. C中snprintf与vsnprintf函数

    博客搬家,原地址:https://langzi989.github.io/2018/01/01/C中snprintf与vsnprintf函数/ 虽然snprintf函数在开发过程中比较常用,但是其中有 ...

  2. sprintf、vsprintf、sprintf_s、vsprintf_s、_snprintf、_vsnprintf、snprintf、vsnprintf 函数辨析

    看了题目中的几个函数名是不是有点头晕?为了防止以后总在这样的细节里纠缠不清,今天我们就来好好地辨析一下这几个函数的异同. 实验环境: Windows下使用VS2017 Linux下使用gcc4.9.4 ...

  3. 各种输出函数的比较(printf/fprintf/sprintf/snprintf/vprintf/vfprintf/vsprintf/vsnprintf)

    对于程序猿来说,printf函数可以说是最熟悉的一个工具了.利用它可以将各类调试信息输出到指定的设备(比如串口)中,实现对程序运行状态的掌控和分析.不过,在实际的应用中,相信大家除了printf函数之 ...

  4. snprintf 引发的问题

    snprintf 引发的问题 snprintf 是 C/C++ 程序中最常见的函数了,但是snprintf 在Windows和 Linux上的行为并不一致,对于跨平台的开发,有时会带来严重的缓冲区溢出 ...

  5. vsnprintf linux,va_list和vsnprintf

    原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在头文件下. VA_LIST的用法: (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针 (2)然后用VA_STA ...

  6. vsnprintf linux,你如何安全地调用vsnprintf()?

    这是在除SunOS 4(已经过时20年)之后的每个操作系统上使用snprintf和vsnprintf的正确方法,因此您的问题就在其他地方. 我会做一个纯粹的猜测,并说我几乎可以肯定你的问题是你将va_ ...

  7. snprintf和strcpy和strncpy的区别

    概述 snprintf,strcpy,strncpy这几个函数的功能都是将原字符串拷贝到目的字符串中.但是在细节部分还是存在着一些细微的差别.主要参考man说明. snprintf 格式 int sn ...

  8. 固件安全性—防止内存损坏和注入攻击

    固件安全性-防止内存损坏和注入攻击 Firmware Security – Preventing memory corruption and injection attacks 构成物联网(IoT)主 ...

  9. C和C++安全编码笔记:格式化输出

    C标准中定义了一些可以接受可变数量参数的格式化输出参数,参数中包括一个格式字符串.printf()和sprintf()都是格式化输出函数的例子.格式化输出函数是由一个格式字符串和可变数目的参数构成的. ...

最新文章

  1. 苹果vs剪辑下载_视频剪辑软件下载
  2. Django1.9开发博客02- 模型
  3. openssl qt linux 安装,在Ubuntu 16.04.1上使用OpenSSL构建Qt失败
  4. RxJava 和 RxAndroid 一 (基础)
  5. 深入源码 UITableView 复用技术原理分析
  6. 实验八 接口与实现接口的类
  7. ios 设置属性的center_ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
  8. vue事件修饰符:通过@click.capture捕获内层事件(爷爷-父亲-儿子)
  9. VTK:PolyData之PointCellIds
  10. Qt学习笔记之事件处理
  11. 信息学奥赛一本通(1202:Pell数列)
  12. Java学习笔记:进程与线程、BIO、NIO、Selector
  13. ONENET平台简介及简单的接入方法
  14. Google Chrome 初试手记
  15. 好烦,一封报警邮件,大量服务节点 redis 响应超时,又得要捉“虫”!
  16. “国防七子”经费暴增,清华再增45亿,甩第二名101亿 |全国高校2022预算大公开...
  17. Nginx负载均衡配置实例详解(转发学习)留给未来需要的自己
  18. 从官方下载IAR方法
  19. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。七 (中)京东后台提交退款订单...
  20. 经典编程习题,用Java实现:矩阵转置、最大公约数和最小公倍数、计算自然对数的底e的值、输出1000以内的回文素数、判断两个年份之间的平闰年情况。

热门文章

  1. 蚌埠2021高考成绩查询,2021蚌埠市地区高考成绩排名查询
  2. stm32 高级定时器
  3. 麒麟操作系统Kylin V10 安装达梦数据库DM8 客户端远程调试
  4. kali系统 安装百度网盘 错误 libappindicator3-1 依赖于 libindicator3-7
  5. mysql 8.0 1114 Error, The table /tmp/#sql~~~ is full
  6. Scanner 扫描文件内容 读取文件
  7. 利用Sentiwordnet进行文本情感分析(简)
  8. 2023年中国酒店业数字化转型趋势报告
  9. QQ贴吧那种图片一点开,就变了的原理
  10. ocv特性_图3在有负载的情况下电池的ocv特性和放电曲线.pdf