标签: address-sanitizer

为什么地址消毒剂对bss全局溢出不起作用?

我做了什么.

测试1

  1 #include <stdio.h>                                                              
  2                                                                                 
  3 int test[16];                                                                   
  4                                                                                 
  5 int main()                                                                      
  6 {                                                                               
  7     test[17] = -1;                                                              
  8 } 

/tmp $ gcc ./main.c -o main -fsanitize=address
/tmp $ ./main 
/tmp $
Run Code Online (Sandbox Code Playgroud)

TEST2

  1 #include <stdio.h>                                                              
  2                                                                                 
  3 int test[16] = {1};                                                             
  4                                                                                 
  5 int main()                                                                      
  6 {                                                                               
  7     test[17] = -1;                                                              
  8 }

 /tmp $ gcc ./main.c -o main -fsanitize=address
 /tmp $ ./main 

=================================================================
==19776==ERROR: AddressSanitizer: global-buffer-overflow on address 
...
Run Code Online (Sandbox Code Playgroud)

看起来全局缓冲区溢出检测不适用于放在bss中的全局变量(是这样吗?).这背后的原因是什么?

更新:

存储的代码没有优化.系统信息:

$ gcc --version
gcc (Ubuntu …
Run Code Online (Sandbox Code Playgroud)

c memory-management buffer-overflow address-sanitizer

9
推荐指数
1
解决办法
428
查看次数

LeakSanitizer 在 Ubuntu 18.04 中的 gdb 下不起作用?

我最近将 Linux 开发 VM 从 Ubuntu 16.04 升级到 18.04,并注意到一件事发生了变化。这是在 x86-64 上。在 16.04 中,我一直有这样的工作流程,我将使用 gcc(5.4,16.04 中的股票版本)和-fsanitize=addressand构建我正在处理的项目-O0 -g,然后通过 gdb(7.11.1,也是Ubuntu 附带的版本)。这工作得很好,最后,如果 LeakSanitizer 检测到内存泄漏,它会生成一个泄漏报告。

在 18.04 中,这似乎不再起作用;LeakSanitizer 抱怨在 ptrace 下运行:

==5820==LeakSanitizer has encountered a fatal error.
==5820==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==5820==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)
Run Code Online (Sandbox Code Playgroud)

然后程序崩溃:

Thread 1 "spyglass" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
Run Code Online (Sandbox Code Playgroud)

我不确定是什么导致了新行为。在 18.04 上,我使用默认的 gcc (7.3.0) 进行构建,使用-fsanitize=address -O0 -g默认的 gdb (8.1.0)进行调试。可以以某种方式重新启用旧行为吗?或者我是否需要更改我的工作流程并在杀死它以获得泄漏报告之前与程序分离?

linux gcc gdb address-sanitizer gcc7

9
推荐指数
1
解决办法
5537
查看次数

使用MinGW-w64的Clang 8:如何使用地址和UB消毒器?

Clang 8发行说明中有以下内容:

  • 允许在MinGW上使用Address Sanitizer和Undefined Behavior Sanitizer。

但是,我无法弄清楚如何正确使用它们。

我将Clang 8.0.0与MSYS2 MinGW GCC结合使用。确切的细节在问题的底部。

我正在尝试编译以下最少的代码:

1.cpp

#include <iostream>

int main()
{
    // Testing ubsan
    int x = 0x7fffffff;
    x++;
    std::cout << x << std::endl;

    // Testing asan
    int *y = new int;
    delete y;
    std::cout << *y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

以下是结果-fsanitize=address

# /z/Lander/LLVM/bin/clang++ -target x86_64-w64-windows-gnu -fsanitize=address 1.cpp
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic-x86_64.dll.a: No such file or directory
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic_runtime_thunk-x86_64.a: No such file or directory
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic_runtime_thunk-x86_64.a: No …
Run Code Online (Sandbox Code Playgroud)

c++ clang mingw-w64 address-sanitizer ubsan

9
推荐指数
2
解决办法
495
查看次数

解决消毒剂警告

几天后,我在Xcode 7.3中启动Address Sanitizer时出现以下问题.当Sanitizer发现问题(实际上被文件抑制)时,打印到Xcode控制台的错误消息:

== 13392 ==警告:无法在fd 55写入符号化程序

== 13392 ==警告:无法在fd 55写入符号化程序

== 13392 ==警告:无法在fd 55写入符号化程序

== 13392 ==警告:无法在fd 55写入符号化程序

== 13392 ==警告:无法使用并重启外部符号器!

我在存储库中找到了错误消息但仍然无法解释发生了什么.显然内部写入功能失败但我不知道是什么导致这种情况.有任何想法吗?

https://github.com/Microsoft/compiler-rt/blob/master/lib/sanitizer_common/sanitizer_symbolizer_process_libcdep.cc#L100

clang sanitizer address-sanitizer

8
推荐指数
1
解决办法
1331
查看次数

未定义符号:__asan_option_detect_stack_use_after_return

我正在尝试使用 clang 的地址清理程序编译 C++ 以在核心转储中输出清理结果,所以我添加了:

CXXFLAGS += -fsanitize=address
Run Code Online (Sandbox Code Playgroud)

有编译器选项:

/opt/llvm-3.8.0/bin/clang++ --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=address -DLINUX -DLINUX64 -DTB_USE_RCU -DURCU_INLINE_SMALL_FUNCTIONS -DU_USING_ICU_NAMESPACE=0 -DNDEBUG -D_POSIX_PTHREAD_SEMANTICS -fPIC -D_GNU_SOURCE -DTB_USE_RCU -DTB_USE_RCU -D_GLIBCXX_USE_CXX11_ABI=0 -m64 --gcc-toolchain=/opt/gcc-5.2.0 -flto=full -std=gnu++14 -D_GLIBCXX_DEPRECATED= -pipe -fno-omit-frame-pointer -ffast-math -fno-finite-math-only -pthread -march=core2 -mtune=corei7 -g -O3 -Qunused-arguments -fnon-call-exceptions -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -Wshadow -Wpointer-arith -Wno-self-assign -Wno-unused-function -Wno-gnu-empty-initializer -Wno-unused-parameter -Wno-ignored-qualifiers -Wno-mismatched-tags -Wno-unused-local-typedef -Wno-parentheses-equality -Wno-unused-private-field -Wno-missing-field-initializers -Wno-missing-braces -Werror=return-type -Werror=overloaded-virtual -c MyClass.cpp -o MyClass.o
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

undefined symbol: __asan_option_detect_stack_use_after_return
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最简单方法是什么?

llvm clang clang++ address-sanitizer

8
推荐指数
0
解决办法
5391
查看次数

Mac OS:泄漏消毒剂

Mac OS X 塞拉利昂 10.13

我按照这里写的 https://clang.llvm.org/docs/LeakSanitizer.html

即创建了内存泄漏的小应用程序

#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  p = 0; // The memory is leaked here.
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后构建并运行以测试如何检测内存泄漏:

admins-Mac:test2 admin$ clang -fsanitize=address -g mleak.c ; ASAN_OPTIONS=detect_leaks=1 ./a.out
==556==AddressSanitizer: detect_leaks is not supported on this platform.
Abort trap: 6
admins-Mac:test2 admin$ 
Run Code Online (Sandbox Code Playgroud)

我如何检测泄漏?我需要将它用于我的大型应用程序。

macos memory-leaks address-sanitizer

8
推荐指数
2
解决办法
5046
查看次数

python 扩展上的地址消毒剂

我正在尝试使用 Address Sanitizer 编译一个 python 扩展。当我加载扩展时,我得到

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    from extension import package
  File "/tmp/python_test/extension/package.py", line 28, in <module>
    from extension._ext import *
ImportError: /tmp/python_test/extension/_ext.so: undefined symbol: __asan_version_mismatch_check_v8
Run Code Online (Sandbox Code Playgroud)

编译器调用是

clang -g -o _ext.so code.ll -fsanitize=address -lrt -lpthread -ldl -lstdc++ -lm -fPIC -shared
Run Code Online (Sandbox Code Playgroud)

因此,它不会从 asan 正确加载符号。我试过使用-static-libsan,但结果是一样的。

我已经看到有些人习惯LD_PRELOAD将 Asan 放入共享对象中,但是,似乎libasan.so我系统上的 Address Sanitizer 来自不同版本的 Address Sanitizer(从 Debian 的 libasan3 包安装,而我从 deb http://apt .llvm.org/stretch/ llvm-toolchain-stretch-8 主)。

那么,如何使 Address Sanitizer 与共享对象库一起使用?要么,我需要正确的版本 …

python clang address-sanitizer

8
推荐指数
1
解决办法
2110
查看次数

AddressSanitizer,这些术语是什么意思?

所以我正在使用 AddressSanitizer。但是在描述问题时它使用了一些密集的术语。

Shadow bytes around the buggy address:
  0x0c067fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7ff0: 00 00 00 …
Run Code Online (Sandbox Code Playgroud)

c gcc clang sanitizer address-sanitizer

8
推荐指数
1
解决办法
2186
查看次数

无法在 minGW 编译器中使用 fsanitize=address

我的 C++ 设置信息: 操作系统 - Windows 10、IDE - VS Code、编译器 - MinGw

问题:-fsanitize=address我最近发现 C++ 的清理程序可以捕获一些运行时错误,例如在我的 VS Code 环境中 进行越界数组访问-fsanitize=undefined

这是一个用于越界数组访问的简单程序: 在此输入图像描述

当我尝试用这一行编译程序时,在 VS Code 中使用的终端是CMDg++ -fsanitize=address check.cpp -o main.exe 在此输入图像描述

按 Enter 键后出现此错误(找不到 -lasan ): 在此输入图像描述

这是 C++ 代码->

// Program to demonstrate 
// accessing array out of bounds
#include <iostream>
using namespace std ;
int main()
{
    int arr[] = {1,2,3,4,5};
    cout<<arr[0]<<endl;
      
    // arr[10] is out of bound
    cout<<arr[10]<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此问题的原因/解决方案 …

c++ mingw-w64 address-sanitizer visual-studio-code

8
推荐指数
0
解决办法
4771
查看次数

Visual Studio 22 - Asan - 无法使用和重新启动外部符号器

我正在尝试为 Visual Studio 2022 设置 Asan Address Sanitizer。我正在遵循 MS 的本指南: https: //learn.microsoft.com/en-us/cpp/sanitizers/asan ?view=msvc-170#ide-msbuild

\n
\n

我能够(我认为大部分)遵循说明。

\n

但当我使用 Asan 运行代码时,我收到此警告。

\n
==14676==WARNING: Failed to use and restart external symbolizer!\n    #0 0x7ff67ec8109f in main C:\\Users\\Vader\\source\\repos\\AsanTest\\AsanTest\\main.cpp:5\n    #1 0x7ff67ec81f68 in invoke_main D:\\a\\_work\\1\\s\\src\\vctools\\crt\\vcstartup\\src\\startup\\exe_common.inl:78\n    #2 0x7ff67ec81ebd in __scrt_common_main_seh D:\\a\\_work\\1\\s\\src\\vctools\\crt\\vcstartup\\src\\startup\\exe_common.inl:288\n    #3 0x7ff67ec81d7d in __scrt_common_main D:\\a\\_work\\1\\s\\src\\vctools\\crt\\vcstartup\\src\\startup\\exe_common.inl:330\n    #4 0x7ff67ec81fdd in mainCRTStartup D:\\a\\_work\\1\\s\\src\\vctools\\crt\\vcstartup\\src\\startup\\exe_main.cpp:16\n    #5 0x7ffe54d07613 in BaseThreadInitThunk+0x13 (C:\\Windows\\System32\\KERNEL32.DLL+0x180017613)\n    #6 0x7ffe563226b0 in RtlUserThreadStart+0x20 (C:\\Windows\\SYSTEM32\\ntdll.dll+0x1800526b0)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

说明说要做 4 件事:

\n

0.启用地址清理程序\xe2\x9c\x85\n在此输入图像描述

\n

1.关闭编辑继续\xe2\x9c\x85\n“启用编辑并继续热重载”已关闭

\n

2. 关闭 /RTC1 (运行时检查) …

c++ visual-studio address-sanitizer visual-studio-2022

8
推荐指数
1
解决办法
386
查看次数