Clang:没有警告 -Wdangling-gsl 和花括号初始化,clang 中的错误?
Clang: no warning with -Wdangling-gsl and curly braces initialization, bug in clang?
考虑以下片段:
#include <string>
#include <string_view>
int main() {
auto str = std::string{};
auto sv1 = std::string_view(str + "!"); // <- warning :)
std::string_view sv2(str + "!"); // <- warning :)
std::string_view sv3 = str + "!"; // <- warning :)
auto sv4 = std::string_view{str + "!"}; // <- no warning :(
std::string_view sv5{str + "!"}; // <- no warning :(
}
编译时带有标记 -std=c++17 -Wdangling-gsl
。在编译器资源管理器中的 clang 12.0.1 和主干中测试。
正如预期的那样,在 sv1
、sv2
和 sv3
中,str + "!"
触发了警告:
Object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]
然而在sv4
和sv5
相同的表达式中,但使用{}
,却没有。
这是使用 {}
的预期行为吗?这是 clang 中的错误吗?我是不是漏掉了什么?
这是 clang 诊断中的一个错误。在最后两个案例中使用花括号不会 'fix' 悬空指针问题。
通过 'confirmation',Visual Studio/MSVC 中的代码分析工具(静态分析器)对 所有五个 svX
变量:
warning C26449: gsl::span or std::string_view created from a temporary will be invalid when the temporary is invalidated (gsl.view).
warning C26815: The pointer is dangling because it points at a temporary instance which was destroyed.
考虑以下片段:
#include <string>
#include <string_view>
int main() {
auto str = std::string{};
auto sv1 = std::string_view(str + "!"); // <- warning :)
std::string_view sv2(str + "!"); // <- warning :)
std::string_view sv3 = str + "!"; // <- warning :)
auto sv4 = std::string_view{str + "!"}; // <- no warning :(
std::string_view sv5{str + "!"}; // <- no warning :(
}
编译时带有标记 -std=c++17 -Wdangling-gsl
。在编译器资源管理器中的 clang 12.0.1 和主干中测试。
正如预期的那样,在 sv1
、sv2
和 sv3
中,str + "!"
触发了警告:
Object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]
然而在sv4
和sv5
相同的表达式中,但使用{}
,却没有。
这是使用 {}
的预期行为吗?这是 clang 中的错误吗?我是不是漏掉了什么?
这是 clang 诊断中的一个错误。在最后两个案例中使用花括号不会 'fix' 悬空指针问题。
通过 'confirmation',Visual Studio/MSVC 中的代码分析工具(静态分析器)对 所有五个 svX
变量:
warning C26449: gsl::span or std::string_view created from a temporary will be invalid when the temporary is invalidated (gsl.view).
warning C26815: The pointer is dangling because it points at a temporary instance which was destroyed.