vla*_*don 20 c++ undefined-behavior c++11 clang++ dangling-pointer
Clang 3.9非常重用临时使用的内存.
此代码是UB(简化代码):
template <class T>
class my_optional
{
public:
bool has{ false };
T value;
const T& get_or_default(const T& def)
{
return has ? value : def;
}
};
void use(const std::string& s)
{
// ...
}
int main()
{
my_optional<std::string> m;
// ...
const std::string& s = m.get_or_default("default value");
use(s); // s is dangling if default returned
}
Run Code Online (Sandbox Code Playgroud)
我们有大量类似上面的代码(my_optional只是一个简单的例子来说明它).
因为UB所有的clang编译器从3.9开始重用这个内存,而且它是合法的行为.
问题是:如何在编译时检测这种悬空引用,或者在运行时检测清理程序?没有clang消毒剂可以检测到它们.
UPD.请不要回答:"使用std::optional".仔细阅读:问题不是关于它.
UPD2.请不要回答:"你的代码设计很糟糕".仔细阅读:问题不是代码设计.
Seb*_*edl 23
您可以通过添加额外的重载来检测此特定API的滥用:
const T& get_or_default(T&& rvalue) = delete;
Run Code Online (Sandbox Code Playgroud)
如果给出的参数get_or_default是真正的右值,则会选择它,因此编译将失败.
至于在运行时检测此类错误,请尝试使用Clang的AddressSanitizer,ASAN_OPTIONS=detect_stack_use_after_return=1并-fsanitize-address-use-after-scope启用use-after-return()和/或use-after-scope()检测.
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |