【问题标题】:Why am I not getting a warning by my compiler, although I've added these compiler options in tasks.json?为什么我的编译器没有收到警告,尽管我在 tasks.json 中添加了这些编译器选项?
【发布时间】: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


【解决方案1】:

没有办法保证对向量的越界访问发出警告或错误。

您可以做的就是从使用 [] 切换到使用 at 之类的

int main()
{
    std::vector<int> a(1);
    std::cout << a.at(3);
}

这将在运行时生成异常,您可以编写代码来处理该异常。

【讨论】:

  • 是否有可能通过使用编译标志来保证越界错误(使用[]时)?
  • @Ruirui AFAIK,没有。这对编译器来说工作量太大了。对于有本地数组并且使用编译时间值的情况,编译器会发出警告,但向量没有已知的元素编译时间大小,因此分析代码要困难得多。这就是at 存在的原因,或者您总是检查访问以确保索引有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多