Обнаружить UB как Rust

Два упрощенных примера:

#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?) Есть возможность обнаружить такое неопределенное поведение?

2

Решение

Из коробки нет, ты не можешь. C ++ не похож на ржавчину и дает вам возможность выстрелить себе в ногу.

К счастью, статический анализатор может обнаружить ошибки для вас. А с помощью статического анализатора Clang, пожизненная проверка на подходе ссылка на сообщение списка рассылки и может удовлетворить ваши потребности.

Если у вас есть ошибки памяти, вы можете обнаружить их с помощью valgrind, это было полезно для меня время от времени.

2

Другие решения

Других решений пока нет …