news 2026/7/7 0:48:07

一个有意思的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/7/6 21:08:57

实战!SpringBoot+MDC实现全链路调用日志跟踪~

之前有一篇文章简单的介绍过MDC&#xff0c;这次结合具体的案例、生产中的具体问题深入了解一下MDC。MDC介绍1、简介&#xff1a;MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录…

作者头像 李华
网站建设 2026/7/7 16:19:06

重定义智能搜索架构:Azure AI双核引擎深度解析与实战部署

重定义智能搜索架构&#xff1a;Azure AI双核引擎深度解析与实战部署 【免费下载链接】azure-search-openai-demo A sample app for the Retrieval-Augmented Generation pattern running in Azure, using Azure AI Search for retrieval and Azure OpenAI large language mode…

作者头像 李华
网站建设 2026/7/7 9:02:31

主观听感测试:用户对EmotiVoice的真实评价

主观听感测试&#xff1a;用户对EmotiVoice的真实评价 在虚拟主播24小时直播、AI伴侣深夜倾诉情绪、游戏NPC因玩家选择而语气骤变的今天&#xff0c;我们早已不再满足于“能说话”的机器。真正打动人的&#xff0c;是那句带着颤抖的“我好难过”&#xff0c;或是突然提高音调的…

作者头像 李华
网站建设 2026/7/7 10:11:18

如何快速上手Metis:新手指南与最佳实践

如何快速上手Metis&#xff1a;新手指南与最佳实践 【免费下载链接】Metis Metis is a learnware platform in the field of AIOps. 项目地址: https://gitcode.com/gh_mirrors/me/Metis Metis是腾讯开源的一款专注于AIOps领域的学件平台&#xff0c;致力于通过智能运维…

作者头像 李华
网站建设 2026/7/7 8:55:52

终极指南:如何在RTX 4060上实现实时图像到视频生成

终极指南&#xff1a;如何在RTX 4060上实现实时图像到视频生成 【免费下载链接】Wan2.1-I2V-14B-480P-StepDistill-CfgDistill-Lightx2v 项目地址: https://ai.gitcode.com/hf_mirrors/lightx2v/Wan2.1-I2V-14B-480P-StepDistill-CfgDistill-Lightx2v Wan2.1-I2V-14B-4…

作者头像 李华
网站建设 2026/7/7 13:25:14

【动手学STM32G4】(1)STM32G431之导入和创建项目

【动手学STM32G4】&#xff08;1&#xff09;STM32G431之导入和创建项目 【动手学STM32G4】&#xff08;2&#xff09;STM32G431之外部中断 【动手学STM32G4】&#xff08;3&#xff09;STM32G431之PWM 【动手学STM32G4】&#xff08;4&#xff09;STM32G431之ADC/DAC 【动手学…

作者头像 李华