在下面的代码片段中,有一个不是微不足道的错误,但我希望像 AddressSanitizer 这样的工具来捕捉它。
#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;
}
Run Code Online (Sandbox Code Playgroud)
当作用域向量并在范围之外打印时,catch 引用会抛出一个错误,使用堆后释放。
但是当没有作用域时,std::vector实现可能不会在 pop_back 之后释放内存,因此引用仍然指向有效内存。
我四处搜索,发现您可以手动毒化内存,我想知道这是否已在 STL 中实现(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
目标 我想定义几个目标:
并能够轻松地在它们之间切换.例如,我不希望每次切换重建我的所有对象,(我将不得不在第一次这样做,但后来如果我修改文件,我做了然后制作asan它应该只重新编译这个文件对于每个目标)
到目前为止我做了什么
我已经设法从根目录创建这些目标,但每次我必须做一个make clean并重新编译.
option(CLANG_MSAN "Enable Clang memory sanitizer" OFF)
if (CLANG_MSAN)
set (CMAKE_CXX_FLAGS "-g -fsanitize=address -fno-omit-frame-pointer")
endif()
add_custom_target(asan
COMMAND ${CMAKE_COMMAND}
-DCLANG_MSAN=ON
-DCMAKE_CXX_COMPILER=clang++
-DCMAKE_C_COMPILER=clang)
Run Code Online (Sandbox Code Playgroud)
是否有可能用CMake做这样的事情?