C++ 性病媒人工中毒
在下面的代码片段中,有一个错误并非微不足道,但我希望AddressSanitarizer之类的工具能够捕捉到它C++ 性病媒人工中毒,c++,address-sanitizer,sanitizer,C++,Address Sanitizer,Sanitizer,在下面的代码片段中,有一个错误并非微不足道,但我希望AddressSanitarizer之类的工具能够捕捉到它 #include <vector> #include <iostream> int main () { std::vector<int> toto; toto.push_back(2); int const& titi = toto[0]; toto.pop_back(); std::cout << titi <
#include <vector>
#include <iostream>
int main ()
{
std::vector<int> toto;
toto.push_back(2);
int const& titi = toto[0];
toto.pop_back();
std::cout << titi << std::endl;
return 1;
}
#包括
#包括
int main()
{
std::向量toto;
toto.推回(2);
int const&titi=toto[0];
toto.pop_back();
std::cout这已经在Clang(libc++)和相对较新的GNU(libstdc++)stl中实现(有关详细信息,请参阅)
此功能的一个问题是,它破坏了单独的清理功能,即仅清理应用程序的一部分(例如,仅可执行文件而非LIB)。问题是,如果未初始化的向量被推入并在净化代码中弹出,则推送程序将不会意识到需要解除缓冲区的锁定。因此,在GCC中默认情况下禁用它(定义\u GLIBCXX\u SANITIZE\u vector
以启用它),由于不清楚的原因,Clang仍然默认使用它。也许有一个运行库在调试版本中使用它。但我不希望在发布版本中使用它,因为它违背了“只为您需要的东西付费”的原则。