如何在自定义字符串类型中实现悬空指针警告

How to implement dangling-pointer warning in custom string type

提问人:StilesCrisis 提问时间:7/10/2023 更新时间:7/10/2023 访问量:62

问:

以下代码无效,因为它需要指向临时对象的指针(触发):-Wdangling-gsl

static std::string f() {
    return "hi";
}

void func() {
    const char* ptr = f().c_str();
}
<source>:8:23: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]

我有一个自定义字符串类,它的外观和感觉很像,但在内部以不同的方式表示文本。std::string

如果以这种方式使用,有没有办法也生成类似的警告?MyString::c_str

C++ 生存期 CPP-core-guidelines

评论

0赞 john 7/10/2023
有趣的问题。我会看一眼你的头文件,看看你看到了什么,<string>
0赞 Slava 7/10/2023
这个问题是特定于编译器的(据我所知,C++语言不支持这个问题),因此指定您正在使用的是哪一个会很有帮助。
0赞 StilesCrisis 7/10/2023
理想情况下,它是通用的,但我们绝对专注于 Clang。
0赞 Slava 7/10/2023
为了使它具有普遍性,它必须在语言层面上得到支持,而它显然不受支持。
0赞 StilesCrisis 7/10/2023
libc++ 中没有什么突出的。 我检查了调用链,似乎没有任何特殊属性。_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const value_type* c_str() const _NOEXCEPT {return data();}

答:

0赞 Jarod42 7/10/2023 #1

我不这么认为警告(除非编译器对此有扩展),但您可以暂时禁止该功能(这也将禁止有效使用)。

const char* MyString::c_str() const && = delete;

评论

4赞 StilesCrisis 7/10/2023
这也将禁止有效使用,例如printf("%s", foo().c_str())
0赞 Slava 7/10/2023
@StilesCrisis +1 - ideone.com/IRtALB
0赞 Jarod42 7/10/2023
@StilesCrisis:我同意。与 Rust 相反,C++ 在类型中没有生存期来发现悬空指针。