当前位置: 首页 > news >正文

记录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过程中遇到的一个小坑,在此分享记录一下。

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

http://www.cnnetsun.cn/news/9146.html

相关文章:

  • 二十三种设计模式(十)--外观模式
  • FSNotes深度体验:从笔记混乱到高效管理的完美蜕变
  • 【大模型必读书籍】轻松入门Cursor与MCP:AI辅助编程,零基础也能成为编程高手!
  • 【Frida Android】实战篇14:非标准算法场景 Hook 教程
  • sfy recommend
  • Wan2.2-T2V-A14B能否生成核酸检测流程指引动画?公共信息传达
  • 告别盈利迷茫!让光储项目赚钱更有依据
  • 深圳便利店鸡尾酒哪家好?浅醺猫定义Z世代“精品自调“新标准
  • 运维工程师转网安要学什么?有什么好处?
  • Wan2.2-T2V-A14B如何实现烟雾扩散的三维渲染?
  • 揭秘VSCode中Cirq智能补全原理:如何实现毫秒级代码建议响应
  • .NET进阶——深入理解委托(1)委托入门
  • 无状态接口设计指南
  • day11日志
  • swiftui—4
  • 为什么你的图片选择器总是出问题?这5个预防技巧让Bug无处可逃
  • 专业做PC耐力板的源头厂家哪个好
  • Wan2.2-T2V-A14B生成丝绸之路历史变迁动态地图
  • [Windows] 自动剪辑音频气口空隙工具
  • ANTLR4 C++目标终极实战指南:从零构建高性能语法解析器
  • 小兔鲜儿UniApp微信小程序开发实战:从零到上线的完整指南
  • HackRF PortaPack H1固件配置完整指南
  • GPT-5.2的发布:将如何影响未来的创作与文化传播?
  • 2025年内容优化工具选型指南:5款热门产品实测,精准匹配全场景需求
  • ArkOS开源游戏系统完整指南:从入门到精通
  • 从开发转到安全渗透工程师,是我做的最对的决定
  • 60亿消息表如何分库分表?
  • 干货分享,大厂内部压测方案设计
  • Python_work3
  • AFLplusplus模糊测试实战:10个高效调试技巧解决常见问题