检测UB样锈蚀

Detect UB like Rust

本文关键字:UB 检测      更新时间:2023-10-16

两个简化示例:

#include <cstdlib>
#include <string>
#include <vector>
class Object{};
void use1(Object * o)
{
    (void)(o);
}
void use2(std::string & s)
{
    (void)(s);
}
int f1()
{
    Object * object_ptr{ nullptr };
    {
        Object object{};
        object_ptr = &object;
    }
    use1(object_ptr); // UB
    return rand();
}
int f2()
{
    std::vector<std::string> v{"foo", "bar"};
    auto & v_ref = v[0];
    v.emplace_back("baz");
    use2(v_ref); // UB
    return rand();
}
int main()
{
    return f1() + f2();
}

rand()仅用于测试。)

Rust就是不能编译这样的源代码。对于Clang或GCC(或者MSVC?),是否有检测这种未定义行为的选项?

开箱即用,不行。C++不像铁锈,它能给你一种射中自己脚的力量。

幸运的是,静态分析器可以为您检测错误。有了clang静态分析器,一个生命周期检查器肯定会链接到邮件列表消息,并可能满足您的需求。

如果你有记忆错误,你可以用valgrind来检测它们,它有时对我很有用。