C++ 检测类锈病

C++ 检测类锈病,c++,gcc,clang,undefined-behavior,compiler-options,C++,Gcc,Clang,Undefined Behavior,Compiler Options,两个简化示例: #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 }; {

两个简化示例:

#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();
}
#包括
#包括
#包括
类对象{};
void use1(对象*o)
{
(无效)(o);
}
void use2(std::string&s)
{
(s)无效;
}
int f1()
{
Object*Object_ptr{nullptr};
{
对象{};
object_ptr=&object;
}
use1(object_ptr);//UB
返回rand();
}
int f2()
{
向量v{“foo”,“bar”};
自动&v_ref=v[0];
v、 安置回(“baz”);
use2(v_ref);//UB
返回rand();
}
int main()
{
返回f1()+f2();
}
rand()
仅用于测试。)


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

开箱即用,不,您不能。C++不像铁锈,它能让你在脚上射中自己的力量。 幸运的是,静态分析器可以为您检测错误。有了叮当作响的静态分析仪,一个终身检测仪肯定就要出现了,可能会满足您的需要


如果你有内存错误,你可以用ValgRink来检测,这对我来说是有用的。

可能的DUPE/相关:Ripe在其类型中有寿命,C++没有。生命周期检查器目前正在clang static Analyzer中运行:@GuillaumeRacicot正在检查可用的工具:PVS Studio可以检测第一个UB(
V506指向局部变量“object”的指针存储在此变量的范围之外。这样的指针将变得无效。
),但无法检测第二个UB。Cppcheck还可以检测第一个(
死指针用法
),但无法检测第二个。好吧,MSVCs(2013)静态分析器即使在使用“所有规则”时也不会发现这些类型的错误。