news 2026/7/7 13:00:01

记录va_list重复使用导致的crash

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记录va_list重复使用导致的crash

博主介绍:程序喵大人

  • 35 - 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

背景

最近遇到了个奇怪的问题,同样的代码,在Windows 下正常运行,在iOS下必现crash。

异常代码如下:

std::stringStringPrintf(constchar*format,...){va_list ap;va_start(ap,format);char*buffer=nullptr;constsize_t size=std::vsnprintf(nullptr,0,format,ap)+1;buffer=newchar[size];std::vsnprintf(buffer,size,format,ap);va_end(ap);std::stringresult(buffer);delete[]buffer;returnresult;}

经过分析定位后发现,这里重复使用了va_list并且在vsnprintf后还继续使用了ap,进而导致的crash。

通过查看文档:https://port70.net/~nsz/c/c11/n1570.html#7.21.6.8

这里明确说明,arg在vsnprintf后,会变成不确定的状态。所以才有了在Windows上可以正常运行,在iOS上会异常退出的问题。

如何解决这个问题?

标准做法是使用va_copy复制一份va_list,如下:

std::stringStringPrintf(constchar*format,...){va_list ap,ap_copy;va_start(ap,format);va_copy(ap_copy,ap);constint32_tsize=std::vsnprintf(nullptr,0,format,ap)+1;va_end(ap);if(size<=0){return"";}char*buffer=newchar[size];std::vsnprintf(buffer,size,format,ap_copy);va_end(ap_copy);std::stringresult(buffer);delete[]buffer;returnresult;}

以前都是直接使用的三方库StringPrintf,而没有自己实现。这也算是使用vsnprintf过程中遇到的一个小坑,在此分享记录一下。

码字不易,欢迎大家点赞,关注,评论,谢谢!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 11:09:33

z命令核心引擎深度解析:打造极致高效的终端目录导航系统

z命令核心引擎深度解析&#xff1a;打造极致高效的终端目录导航系统 【免费下载链接】z z - jump around 项目地址: https://gitcode.com/gh_mirrors/z/z 作为一名开发者&#xff0c;你是否曾经在终端中反复输入冗长的cd命令&#xff0c;只为跳转到那个你每天都要访问的…

作者头像 李华
网站建设 2026/7/7 16:28:31

引爆AI界!RAG、Agent、多模态三剑合璧,未来3年风口全在这!

大模型作为产业变革的核心引擎。通过RAG、Agent与多模态技术正在重塑AI与现实的交互边界。三者协同演进&#xff0c;不仅攻克了数据时效性、专业适配等核心挑战&#xff0c;更推动行业从效率革新迈向业务重构。本文将解析技术演进脉络、实战经验与未来图景&#xff0c;为读者提…

作者头像 李华
网站建设 2026/7/7 13:31:34

30.8.14.数据库与数据仓库

在企业信息系统中&#xff0c;数据库&#xff08;Database&#xff09; 和 数据仓库&#xff08;Data Warehouse, DW&#xff09; 是核心组成部分。它们都处理数据&#xff0c;但设计理念、用途、架构、操作方式和优化目标完全不同。理解它们的差异&#xff0c;对系统设计、数据…

作者头像 李华
网站建设 2026/7/7 7:30:44

从“看见”到“预见”:数字孪生如何重塑城市公共安全新防线

在城市这个庞大而复杂的生命体中&#xff0c;公共安全是维系其健康运转的基石。然而&#xff0c;传统的安全管理模式正面临严峻挑战&#xff1a;海量数据分散在烟囱式系统中&#xff0c;应急响应依赖事后调度&#xff0c;风险预警如同“雾里看花”。如何将分散的“信息孤岛”串…

作者头像 李华
网站建设 2026/7/7 18:02:01

终极指南:如何快速掌握REW声学测试软件

终极指南&#xff1a;如何快速掌握REW声学测试软件 【免费下载链接】REW声学测试软件超详细操作手册分享 REW 声学测试软件超详细操作手册 项目地址: https://gitcode.com/Open-source-documentation-tutorial/d36fd 想要轻松上手专业的REW声学测试软件吗&#xff1f;这…

作者头像 李华