AnyMath 文档

消毒器支持

Sanitizers可以在自定义Julia构建中使用,以便更容易检测Julia内部C/C中的某些类型的错误++ 密码。

地址消毒器:易于构建

从Julia的源代码签出,您应该能够在Julia和LLVM中构建一个支持地址清理的版本,如下所示:

$ mkdir /tmp/julia
$ contrib/asan/build.sh /tmp/julia/

我们选择了 /tmp/朱莉娅 作为构建目录,但您可以选择任何您想要的。 构建完成后,运行要测试的工作负载 /tmp/朱莉娅/朱莉娅. 内存错误会导致错误。

如果您需要自定义或进一步的细节,请参阅下面的文档。

一般考虑因素

使用Clang的消毒器显然需要你使用Clang(USECLANG=1),但还有另一个问题:大多数清理程序需要一个由主机编译器提供的运行时库,而Julia的JIT生成的检测代码依赖于该库的功能。 这意味着主机编译器的LLVM版本必须与Julia中使用的LLVM库的版本相匹配。

一个简单的解决方案是有一个专门的构建文件夹,用于提供匹配的工具链,通过构建 BUILD_LLVM_CLANG=1. 然后,您可以通过指定从另一个生成文件夹引用此工具链 USECLANG=1 在复盖 CC脦陋胫茫CXX的 变量。

当它们检测到共享库正在使用以下方法打开时,消毒程序会出错 RTLD_DEEPBIND (参考:https://github.com/google/sanitizers/issues/611[google/sanitizers#611])。https://github.com/staticfloat/libblastrampoline[libblastrampoline]默认使用 RTLD_DEEPBIND,我们需要设置环境变量 LBT_USE_RTLD_DEEPBIND=0 使用消毒液时。

使用其中一个消毒器 消毒=1 然后是您要使用的消毒器的适当标志。

在macOS上,这可能需要一些额外的标志也工作。 总之,它可能看起来像这样,加上一个或多个 消毒,消毒_* 下面列出的标志:

make -C deps USE_BINARYBUILDER_LLVM=0 LLVM_VER=svn stage-llvm

make -C src SANITIZE=1 USECLANG=1 \
    CC=~+/deps/scratch/llvm-svn/build_Release/bin/clang \
    CXX=~+/deps/scratch/llvm-svn/build_Release/bin/clang++ \
    CPPFLAGS="-isysroot $(xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" \
    CXXFLAGS="-isystem $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1"

(或将这些放入您的 做吧。用户,所以你不需要每次都记住它们)。

地址消毒器(ASAN)

对于检测或调试内存错误,您可以使用Clang的https://clang.llvm.org/docs/AddressSanitizer.html[地址消毒器(ASAN)]。 通过编译与 消毒地址=1 您为Julia编译器及其生成的代码启用ASAN。 此外,您可以指定 LLVM_SANITIZE=1 也要清理LLVM库。 请注意,这些选项会产生很高的性能和内存成本。 例如,将Asan用于Julia和LLVM使得 测试1 占用8-10倍的时间,同时使用20倍的内存(通过使用下面描述的选项,这可以分别减少到3和4的因子)。

默认情况下,Julia设置 allow_user_segv_handler=1 ASAN标志,这是信号传递正常工作所必需的。 您可以使用 ASAN_选项 环境标志,在这种情况下,您需要重复前面提到的默认选项。 例如,可以通过指定来减少内存使用 fast_unwind_on_malloc=0malloc_context_size=2,以回溯精度为代价。 目前,朱莉娅还设置 detect_leaks=0,但这应该在未来被删除。

示例设置

步骤1:安装工具链

签出Git worktree(或创建树外构建目录) $工具链_WORKTREE 并创建一个配置文件 $TOOLCHAIN_WORKTREE/Make.用户

USE_BINARYBUILDER_LLVM=1
BUILD_LLVM_CLANG=1

跑:

cd $TOOLCHAIN_WORKTREE
make -C deps install-llvm install-clang install-llvm-tools

安装工具链二进制文件 $TOOLCHAIN_WORKTREE/usr/tools

步骤2:使用ASAN构建Julia

签出Git worktree(或创建树外构建目录) $BUILD_WORKTREE 并创建一个配置文件 $BUILD_WORKTREE/Make.用户

TOOLCHAIN=$(TOOLCHAIN_WORKTREE)/usr/tools

# use our new toolchain
USECLANG=1
override CC=$(TOOLCHAIN)/clang
override CXX=$(TOOLCHAIN)/clang++
export ASAN_SYMBOLIZER_PATH=$(TOOLCHAIN)/llvm-symbolizer

USE_BINARYBUILDER_LLVM=1

override SANITIZE=1
override SANITIZE_ADDRESS=1

# make the GC use regular malloc/frees, which are hooked by ASAN
override WITH_GC_DEBUG_ENV=1

# default to a debug build for better line number reporting
override JULIA_BUILD_MODE=debug

# make ASAN consume less memory
export ASAN_OPTIONS=detect_leaks=0:fast_unwind_on_malloc=0:allow_user_segv_handler=1:malloc_context_size=2

JULIA_PRECOMPILE=1

# tell libblastrampoline to not use RTLD_DEEPBIND
export LBT_USE_RTLD_DEEPBIND=0

跑:

cd $BUILD_WORKTREE
make debug

建造 朱莉娅-调试 和阿桑在一起。

记忆消毒器(MSAN)

对于未初始化内存的使用,可以使用Clang的https://clang.llvm.org/docs/MemorySanitizer.html[内存消毒器(MSAN)]通过编译与 SANITIZE_MEMORY=1.

螺纹消毒器(TSAN)

对于调试数据竞争和其他线程相关的问题,您可以使用Clang的https://clang.llvm.org/docs/ThreadSanitizer.html[线程消毒器(TSAN)]通过编译 SANITIZE_THREAD=1.