【发布时间】:2021-02-19 16:44:55
【问题描述】:
我正在使用 VSCode 并遵循本教程:https://code.visualstudio.com/docs/cpp/config-mingw
在我的tasks.json 文件中,我添加了两个命令行参数"-Wall"、"-fsanitize=undefined" 和-fsanitize=address。
文件现在看起来像这样:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++.exe build active file",
"command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"-Wall",
"-fsanitize=undefined",
"-fsanitize=address",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
如果我运行下面的简单代码,我不会收到任何警告,尽管我正在尝试访问大小为 1 的向量的索引 3 处的元素。我必须做什么才能获得警告/错误?
#include <iostream>
#include <vector>
int main()
{
std::vector<int> a(1);
std::cout << a[3];
}
【问题讨论】:
-
您可以随时将此错误检查添加到您的代码审查清单中。
-
我现在看到只有最新版本的
g++会警告越界访问。 10.2 不会发出警告,但主干版本会在 goldbolt 发出警告。 -
我认为你必须去 Nathans 回答并使用
at()来获得例外。编译器只能捕获简单的越界错误,因此即使您获得了较新的g++版本,也不能依赖它。想想你是否得到一些应该用作索引的用户输入。编译器永远无法捕捉到这一点。 -
@Ruirui 如果您调试编译您的程序(并添加
-fsanitize=address),我很确定您在执行问题中的程序时会得到一个很好的转储。我不认为 VSCode 与发生的任何事情有任何关系。编辑器太棒了。 -
@Ruirui
g++ --version报告什么?g++ 8.1seems to dump it nicely
标签: c++ visual-studio-code g++ warnings