news 2026/5/1 4:42:11

记录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/5/1 7:57:25

中山SEO:AI时代的“人机协作”新模式

随着AI技术的飞速发展&#xff0c;中山SEO行业正面临着巨大的变革。AI不仅能够提升工作效率&#xff0c;还能够通过智能化的数据分析和内容生成&#xff0c;帮助企业提升在搜索引擎中的排名。然而&#xff0c;AI并非万能&#xff0c;仍然存在无法替代人工干预的局限性&#xff…

作者头像 李华
网站建设 2026/4/29 18:54:43

云数据查询终极指南:5分钟构建多云资产清单

想要快速掌握云数据查询的核心技能&#xff1f;CloudQuery作为基于GraphQL的数据查询引擎&#xff0c;能够将SQL查询转换为GraphQL查询&#xff0c;帮助您轻松构建完整的云资产清单。无论您是新手还是经验丰富的云工程师&#xff0c;这个开源项目都能为您的多云环境管理带来革命…

作者头像 李华
网站建设 2026/5/1 7:57:31

ZCC1004E-120V 3A 零功耗使能异步降压电源芯片

**概述ZCC1004E是一款支持宽电压输入的开关降压型 DC-DC 控制器&#xff0c;最高输入电压 120V。具有低待机功耗、高效率、低纹波、优异的母线电压调整率和负载调整率等特性。内置150V 60mΩ功率管支持3A电流输出 可通过设置 FB 引脚的分压电阻可设置输出恒压值。 采用固定频率…

作者头像 李华
网站建设 2026/5/1 2:44:02

深入探索C++数据结构与算法精要

深入探索C数据结构与算法精要 【免费下载链接】数据结构和算法分析C版第三版分享 数据结构和算法分析 C版 第三版欢迎来到《数据结构和算法分析 C版》第三版资源页面 项目地址: https://gitcode.com/Open-source-documentation-tutorial/ad4b6 在计算机科学领域&#xf…

作者头像 李华
网站建设 2026/5/1 6:48:25

Dify混合检索配置避坑指南,90%团队忽略的3个关键参数

第一章&#xff1a;混合检索策略的 Dify 配置优化在构建智能问答系统时&#xff0c;Dify 平台提供了灵活的检索增强生成&#xff08;RAG&#xff09;能力&#xff0c;其中混合检索策略是提升召回准确率的关键。通过结合关键词检索与向量语义检索&#xff0c;系统能够在保证相关…

作者头像 李华