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

一个有意思的bug

今天来分享一个很久之前的bug。

把项目中的代码使用另一种方式来表述,大致是这样的:

#include <iostream> #include <cstring> #include <cstdlib> void fun(std::size_t size){ char buffer[size]; std::memset(buffer, 0, size); // 防止优化掉 std::cout << buffer << std::endl; } int main(int argc, char* argv[]){ if (argc < 2) { std::cerr << "Usage: ./a.out <size>\n"; return 1; } std::size_t size = std::stoul(argv[1]); fun(size); return 0; }

这段代码一直运行的很好,直至某一天,传入了一个合理的值(超过默认栈大小),之后程序开始崩溃,出现 segmentation fault。原因是:代码试图在栈上分配过大的内存

当然了,修复方式也很简单,无非是以下几种:

  • • std::vector v(size)

  • • std::string s(size, 0)

  • • std::unique_ptr<char[]>(new char[size])

  • • 等等

我当时的疑惑是:这段代码一开始是怎么成功编译的?

根据C标准,栈上分配的对象(局部数组)的大小必须在编译期已知。但示例中`char buffer[size];`明显不符合标准,后面查了相关资料,**这种写法属于VLA(边长数组),这是 C99 的特性,不属于 C**。

那么问题来了:C++ 不支持变长数组GCC 和 Clang却能编译这段代码,这是因为GCC 与 Clang 默认启用了 C99 扩展。

可以采用以下方式来避免此种错误:我们可以使用-Werror=vla来避免,即编译命令中加上即可,这样报错如下:

<source>:10:10: error: variable length array 'buffer' is used [-Werror=vla] 10 | char buffer[size]; | ^~~~~~

当然了,也有更严格的限制:-pedantic。它告诉编译器严格按照 C++ 标准,不允许任何扩展。

输出如下:

<source>:10:10: warning: ISO C++ forbids variable length array 'buffer' [-Wvla] 10 | char buffer[size]; | ^~~~~~
http://www.cnnetsun.cn/news/118434.html

相关文章:

  • 高效实现!分布式链路追踪:TraceIdFilter + MDC + Skywalking
  • EmotiVoice声音克隆功能实测:5秒样本还原度高达90%以上
  • AI服务热更新终极方案:零停机模型动态替换完整指南
  • 彻底告别语言障碍:Agent Zero多语言界面配置终极指南
  • 全国铁路货运站点分布图使用全攻略
  • AMD GPU终极指南:快速部署FlashAttention实现3-5倍AI加速
  • 从零开始掌握Stability AI视频生成:5步解决常见问题并提升效果
  • 只需3秒音频样本!EmotiVoice实现精准声音克隆
  • EmotiVoice日志分析:定位语音生成异常原因
  • Nacos配置推送失败的5个致命陷阱及终极修复方案
  • Sealos动态PVC管理终极指南:三步告别存储运维烦恼
  • 基于SpringBoot+Vue的滑雪场管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • Java Web 短流量数据分析与可视化abo系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 【计算机毕业设计案例】基于springboot+微信小程序的DIY电脑推荐与交流平台DIY组装电脑踩坑,手残党DIY装机分享(程序+文档+讲解+定制)
  • Bazel终极指南:快速构建大规模多语言项目的完整解决方案
  • 终极Git文件管理指南:快速配置.gitattributes模板集合
  • 告别手绘流程图:Drawnix文本转图形黑科技全揭秘
  • 软件开发设计原则: 七大设计原则拯救面条代码
  • EmotiVoice用于虚拟主播直播的实时语音推流
  • Android ANR 深度起底:从系统埋雷机制到全链路治理体系
  • 2025提示工程实战手册:7天掌握AI对话优化核心技术
  • OpenWrt LuCI主题大比拼:4款官方界面哪个最适合你?
  • 基于 TCP 的IOT物联网云端服务端和设备客户端通信架构设计与实现
  • XYAdmin:基于Vue3与Ant Design的下一代中后台管理系统,重新定义开发效率
  • 中英混合语音生成效果测试:EmotiVoice表现出色
  • Strapi数据建模实战:从零构建灵活高效的内容管理系统
  • Homepage媒体服务监控:打造智能媒体中心控制台
  • 15、远程应用与Citrix XenApp环境中App Volumes部署指南
  • 打造完美浏览器扩展图标的终极指南:从16px到128px的完整设计方法
  • Transformer Lab完整指南:快速上手大语言模型实验平台