小编moe*_*ryn的帖子

std::vector 的手动中毒

在下面的代码片段中,有一个不是微不足道的错误,但我希望像 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

c++ sanitizer address-sanitizer

5
推荐指数
1
解决办法
308
查看次数

CMake,多个目标(asan tsan ..),无需重新编译所有内容

目标 我想定义几个目标:

  • make msan:用clang和内存清理程序编译代码
  • make tsan:使用线程清理程序使用clang编译代码
  • make:使用gcc编译代码

并能够轻松地在它们之间切换.例如,我不希望每次切换重建我的所有对象,(我将不得不在第一次这样做,但后来如果我修改文件,我做了然后制作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做这样的事情?

cmake target

3
推荐指数
1
解决办法
1824
查看次数

标签 统计

address-sanitizer ×1

c++ ×1

cmake ×1

sanitizer ×1

target ×1