news 2026/6/19 5:55:17

一个有意思的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/6/19 6:34:40

GC 垃圾回收器忙半天,在清理什么?

JDK每次大版本更新&#xff0c;会有新的GC垃圾回收器ZGC、Shenandoah等&#xff0c;然后我们就的没完没了的学&#xff0c;死记硬背这些过几天很容易忘了。但如果弄明白GC垃圾回收器它们的本质在干什么&#xff0c;就比较容易记忆了。认真搞清楚一个最基础、却最容易被忽略的问…

作者头像 李华
网站建设 2026/6/15 6:47:01

ChromePass:一键找回Chrome浏览器所有保存密码的终极方案

ChromePass&#xff1a;一键找回Chrome浏览器所有保存密码的终极方案 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经在登录某个重要网站时&#xff0c;明明记得在Ch…

作者头像 李华
网站建设 2026/6/14 18:40:45

ChromePass终极指南:轻松提取Chrome浏览器保存的密码

ChromePass终极指南&#xff1a;轻松提取Chrome浏览器保存的密码 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否遇到过Chrome浏览器中保存的重要密码想不起来的情况&…

作者头像 李华
网站建设 2026/6/12 13:42:59

OSPF实验

一、实验拓扑&#xff08;截取自己的拓扑图&#xff0c;并标注好网段信息&#xff09;二、实验需求1、R1-R3为区域0&#xff0c;R3-R4为区域1&#xff1b;其中R3在环回地址在区域0&#xff1b;2、R1、R2各有一个环回口&#xff1b;3、R1-R3中&#xff0c;R3为DR设备&#xff0c…

作者头像 李华
网站建设 2026/6/15 14:05:36

一些常用的通用 mysql 命令详解及注意事项

以下是部分平时较为常用的通用 mysql 命令。 一、mysql 登录命令 完整命令&#xff1a;mysql –h ip地址 –P 端口 –u 用户名 –p 说明&#xff1a; -h&#xff1a;登录连接的ip地址&#xff0c;本机为 localhost 或者 127.0.0.1 -P&#xff1a;端口&#xff0c;本机默认…

作者头像 李华