Два упрощенных примера:
#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, это было полезно для меня время от времени.
Других решений пока нет …