news 2026/4/23 14:14:56

记录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/4/23 14:13:52

Wan2.2-T2V-A14B模型对中文语境描述的理解优化

Wan2.2-T2V-A14B&#xff1a;让中文描述“动”起来的AI视频引擎 &#x1f3ac; 你有没有试过这样写一段话&#xff1a;“清晨&#xff0c;薄雾笼罩着江南水乡&#xff0c;一位穿蓝印花布衣的姑娘撑着油纸伞走过石桥&#xff0c;远处传来悠扬的笛声。” 然后希望它直接变成一段画…

作者头像 李华
网站建设 2026/4/23 11:26:22

彻底解决HtmlSanitizer中AngleSharp版本冲突:终极避坑指南

彻底解决HtmlSanitizer中AngleSharp版本冲突&#xff1a;终极避坑指南 【免费下载链接】HtmlSanitizer Cleans HTML to avoid XSS attacks 项目地址: https://gitcode.com/gh_mirrors/ht/HtmlSanitizer 在.NET Framework环境下使用HtmlSanitizer库时&#xff0c;开发者经…

作者头像 李华
网站建设 2026/4/23 11:25:54

万字长文:2026年应该了解的20个Agentic AI框架

本文详细解析2026年20个主流Agentic AI框架&#xff0c;包括CrewAI、AutoGen、LangChain等&#xff0c;全面分析各框架特征、优缺点及应用场景。提供按场景分类的选型指南&#xff0c;覆盖多智能体协作、低代码开发、RAG应用等方向&#xff0c;帮助开发者根据需求快速定位适合的…

作者头像 李华
网站建设 2026/4/23 5:36:06

从“看得见”到“看得懂”:一位城市管理者的数字孪生实践手记

作为一座快速发展中的城市管理者&#xff0c;我和我的团队每天都在面对海量的信息&#xff1a;交通拥堵、突发事件、环境监测、设施运维……过去&#xff0c;这些数据分散在不同的系统里&#xff0c;是一张张报表、一条条曲线和一个个孤立的监控画面。我们迫切需要一个能将这些…

作者头像 李华
网站建设 2026/4/23 12:05:17

Code Converter终极指南:VB.NET到C一键转换完整教程

Code Converter终极指南&#xff1a;VB.NET到C#一键转换完整教程 【免费下载链接】CodeConverter Convert code from C# to VB.NET and vice versa using Roslyn 项目地址: https://gitcode.com/gh_mirrors/co/CodeConverter 在.NET开发世界中&#xff0c;你是否经常遇到…

作者头像 李华
网站建设 2026/4/23 13:30:10

基于Matlab 2021的高性能模型:LADRC与磁链观测器的奇妙组合

模型包含LADRC和磁链观测器算法&#xff0c;可以用于自动代码生成。 (1)磁链观测器&#xff0c;低速性能和高速性能都不错。 (2)LADRC包含扰动观测器&#xff0c;比PI控制器性能更好。 模型基于matlab2021版本在控制系统的领域中&#xff0c;不断探索更优的算法与模型是提升性能…

作者头像 李华