我做了什么.
测试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) 我最近将 Linux 开发 VM 从 Ubuntu 16.04 升级到 18.04,并注意到一件事发生了变化。这是在 x86-64 上。在 16.04 中,我一直有这样的工作流程,我将使用 gcc(5.4,16.04 中的股票版本)和-fsanitize=address
and构建我正在处理的项目-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)进行调试。可以以某种方式重新启用旧行为吗?或者我是否需要更改我的工作流程并在杀死它以获得泄漏报告之前与程序分离?
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) 几天后,我在Xcode 7.3中启动Address Sanitizer时出现以下问题.当Sanitizer发现问题(实际上被文件抑制)时,打印到Xcode控制台的错误消息:
== 13392 ==警告:无法在fd 55写入符号化程序
== 13392 ==警告:无法在fd 55写入符号化程序
== 13392 ==警告:无法在fd 55写入符号化程序
== 13392 ==警告:无法在fd 55写入符号化程序
== 13392 ==警告:无法使用并重启外部符号器!
我在存储库中找到了错误消息但仍然无法解释发生了什么.显然内部写入功能失败但我不知道是什么导致这种情况.有任何想法吗?
我正在尝试使用 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)
解决这个问题的最简单方法是什么?
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)
我如何检测泄漏?我需要将它用于我的大型应用程序。
我正在尝试使用 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 与共享对象库一起使用?要么,我需要正确的版本 …
所以我正在使用 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++ 设置信息: 操作系统 - Windows 10、IDE - VS Code、编译器 - MinGw
问题:-fsanitize=address
我最近发现 C++ 的清理程序可以捕获一些运行时错误,例如在我的 VS Code 环境中
进行越界数组访问-fsanitize=undefined
。
当我尝试用这一行编译程序时,在 VS Code 中使用的终端是CMDg++ -fsanitize=address check.cpp -o main.exe
这是 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)
此问题的原因/解决方案 …
我正在尝试为 Visual Studio 2022 设置 Asan Address Sanitizer。我正在遵循 MS 的本指南: https: //learn.microsoft.com/en-us/cpp/sanitizers/asan ?view=msvc-170#ide-msbuild
\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说明说要做 4 件事:
\n\n\n2. 关闭 /RTC1 (运行时检查) …