首页 > 解决方案 > 对 lambda 的 const 引用导致使用后范围?

问题描述

MSVC Asan 报告了一个我无法理解的 use-after-scope 错误。

示例代码归结为

int main() {
    std::list<std::string> listOfStr;
    const auto& pred = [](const std::string& str) { return true; };
    const auto result = std::find_if(listOfStr.cbegin(), listOfStr.cend(), pred);

    return 0;
}

使用带有以下选项的 MSVC 2019 编译器进行编译:

cl main.cpp /fsanitize=address /Zi /std:c++17

我不会在这里复制完整的错误文本,但我发现 asanstd::find_if在到达find_if' 实现的第一行之前会随时发出警报。

如果我们删除调试信息 ( /Zi) 或切换到 c++17 之前的标准 (remove /std:c++17),错误就消失了。

什么原因?它是 asan 中的错误,还是 c++17 中的引用有一些新内容?

标签: c++visual-c++lambdaaddress-sanitizer

解决方案


推荐阅读