news 2026/4/11 22:02:22

一个有意思的bug

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个有意思的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]; | ^~~~~~
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 3:09:08

Awesomplete主题切换:打造个性化自动完成体验的完整指南

Awesomplete主题切换&#xff1a;打造个性化自动完成体验的完整指南 【免费下载链接】awesomplete Ultra lightweight, usable, beautiful autocomplete with zero dependencies. 项目地址: https://gitcode.com/gh_mirrors/aw/awesomplete Awesomplete作为一款超轻量级…

作者头像 李华
网站建设 2026/4/11 20:29:32

3个终极边缘计算神器:让物联网设备秒变智能终端

还在为物联网设备响应迟缓而烦恼&#xff1f;边缘计算正重新定义物联网的可能性&#xff01;本文将为你介绍3个开源边缘计算项目&#xff0c;让你的设备具备本地化智能处理能力&#xff0c;彻底告别云端依赖。无论你是智能家居爱好者还是工业物联网开发者&#xff0c;这些工具都…

作者头像 李华
网站建设 2026/4/8 4:24:01

PlotNeuralNet零基础入门:30分钟搞定专业级神经网络可视化

PlotNeuralNet零基础入门&#xff1a;30分钟搞定专业级神经网络可视化 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 还在为论文中的神经网络结构图烦恼吗&#xff1f;手…

作者头像 李华
网站建设 2026/3/27 18:07:46

ISO 26262功能安全标准:汽车电子开发的终极指南

ISO 26262功能安全标准&#xff1a;汽车电子开发的终极指南 【免费下载链接】ISO26262中文版本PDF下载分享 ISO 26262 中文版本 PDF 下载 项目地址: https://gitcode.com/Open-source-documentation-tutorial/442c6 &#x1f697; 开启汽车安全新时代 - ISO 26262标准为…

作者头像 李华
网站建设 2026/3/27 21:02:54

XVim架构深度解析:Xcode插件开发的终极实践指南

XVim架构深度解析&#xff1a;Xcode插件开发的终极实践指南 【免费下载链接】XVim Xcode plugin for Vim keybindings 项目地址: https://gitcode.com/gh_mirrors/xv/XVim XVim作为Xcode中实现Vim键绑定的开源插件&#xff0c;其架构设计展现了深度集成Xcode系统的技术精…

作者头像 李华
网站建设 2026/4/6 1:07:47

如何快速配置Druid连接池:新手必学的容器化部署终极指南

如何快速配置Druid连接池&#xff1a;新手必学的容器化部署终极指南 【免费下载链接】druid 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品&#xff0c;为监控而生的数据库连接池 项目地址: https://gitcode.com/gh_mirrors/druid…

作者头像 李华