链接我使用 AddressSanitizer 工具编译的代码时,我收到了许多此类错误undefined reference to '_asan_init_v4'。
clang -fPIC -g -fno-omit-frame-pointer -DNDEBUG -Wl,-z,defs \
-shared -Wl,-soname,libqpid-dispatch.so -o libqpid-dispatch.so \
CMakeFiles/qpid-dispatch.dir/alloc_pool.c.o \
CMakeFiles/qpid-dispatch.dir/amqp.c.o \
[...]
-lpthread -lrt -ldl -lpython3.7m -lwebsockets -fsanitize=address
Run Code Online (Sandbox Code Playgroud)
错误的一些例子
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: CMakeFiles/qpid-dispatch.dir/http-libwebsockets.c.o: in function `qd_http_server_free':
/home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:824: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__asan_report_load8'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__asan_report_load8'
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是 …
我想确定以下程序(查找最大子数组的实现)是否泄漏内存。有没有通用的方法来确定这一点?例如使用调试器的某些功能?什么是一般策略?
struct Interval {
int max_left;
int max_right;
int sum;
};
struct Interval * max_crossing_subarray(int A[], int low, int mid, int high) {
struct Interval * crossing = malloc(sizeof(struct Interval));
int left_sum = INT_MIN;
int sum = 0;
for(int i = mid; i >= low; --i) {
sum = sum + A[i];
if(sum > left_sum) {
left_sum = sum;
crossing->max_left = i;
}
}
int right_sum = INT_MIN;
sum = 0;
for(int j = mid+1; j <= high; ++j) { …Run Code Online (Sandbox Code Playgroud) 什么是调试堆栈值损坏的好方法。在我的程序中,有时在返回对文件描述符进行关闭的方法后,此指针的地址会更改。我调试了几个小时的程序,但找不到问题。
找出改变此指针地址的有效方法是什么?当我在此指针上手动添加监视时,不会发生错误。当我尽可能减少代码时,仍然会发生错误。我尝试了Valgrind,但未发现任何早期堆栈损坏。
我设法检测到何时发生错误,我以64位模式编译了代码。此地址从0xxxxxxx更改为0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,发现了地址更改的时间(有关此信息,请参见第一个段落)。
还有其他方法可以找出造成此问题的原因吗?
我正在尝试学习如何使用-fsanitize=address -fno-omit-frame-pointer来检测内存泄漏。我写了一些简单的东西,显然有内存泄漏,但是编译gcc -fsanitize=address -fno-omit-frame-pointer file.c然后执行该函数似乎没有问题。
这篇文章似乎表明我们需要设置编译器标志和链接器标志,而不是使用-lasan How to use AddressSanitizer in gcc? 。
我认为没有必要,但我已经尝试过,gcc -fsanitize=address -static-libasan -fno-omit-frame-pointer s.c因为文档似乎在这里提到了。https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
我也尝试这样做:https://lemire.me/blog/2016/04/20/no-more-leaks-with-sanitize-flags-in-gcc-and-clang/
以防万一这是相关的,我使用的是 MacOS。我已经通过brew更新和升级了gcc。版本信息是:
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
这是我编写的虚拟代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char *buffer = malloc(1024);
sprintf(buffer, "%d", argc);
printf("%s\n", buffer);
buffer = malloc(10);
buffer[0] = 'A';
buffer[9] = '\0';
printf("%s\n", buffer);
}
Run Code Online (Sandbox Code Playgroud)
我从未释放过任何东西,所以我希望地址清理程序能够捕获它。但是当我运行代码时,我得到以下信息:
$ ./s
1
A????????
Run Code Online (Sandbox Code Playgroud)
我误解/做错了什么?
我想将不同类型的 unique_ptr 存储在向量中。
我尝试按如下方式使用 std::any 。
#include <vector>
#include <any>
#include <memory>
class A
{
int val;
};
class B
{
float val;
};
int main()
{
std::vector<std::any> vec;
auto a = new A();
auto b = new B();
vec.push_back(std::unique_ptr<A>(a));
vec.push_back(std::unique_ptr<B>(b));
}
Run Code Online (Sandbox Code Playgroud)
它失败如下。
main.cpp: In function 'int main()':
main.cpp:23:18: error: no matching function for call to 'std::vector<std::any>::push_back(std::unique_ptr<A>)'
23 | vec.push_back(std::unique_ptr<A>(a));
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/12.1.0/vector:64,
from main.cpp:1:
/usr/local/include/c++/12.1.0/bits/stl_vector.h:1276:7: note: candidate: 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::any; …Run Code Online (Sandbox Code Playgroud) 这是我的代码片段:
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
char key; // value
struct node *next; // pointer to the next element
} Node;
int main(void)
{
Node *n = malloc(sizeof(Node));
n->key = 'K';
n->next = NULL;
free(n);
printf("%c\n", n->key);
}
Run Code Online (Sandbox Code Playgroud)
当上面的代码片段被编译并运行时......
ganningxu@Gannings-Computer:~/test$ gcc test_faults.c -o test_faults; ./test_faults
K
ganningxu@Gannings-Computer:~/test$ clang test_faults.c -o test_faults; ./test_faults
K
Run Code Online (Sandbox Code Playgroud)
访问释放的内存时,不会出现编译器警告或错误。有没有办法强制编译器显示此类错误?
我正在开发一种产品,该产品由多个C ++可执行文件和相互依赖的各种库组成。我正在使用GCC和-fsanitize-address。据我了解,如果我想将地址清理器与库一起使用,则必须将其构建为共享对象(这是GCC的默认选项)。因此,我认为最好的选择是-static-libasan为可执行文件静态地构建地址清理器,并为库动态地构建地址清理器。但是,当我这样做时,在构建C ++可执行文件之一时出现链接错误:
==10823==Your application is linked against incompatible ASan runtimes
Run Code Online (Sandbox Code Playgroud)
这使我认为静态和动态版本的地址清除器不能与GCC混合使用,对吗?我在消毒剂GitHub页面上找不到关于此的任何信息。
我将在这里受到打击,因为我正在使用我不完全理解的工具,也没有花时间这样做。在这一点上,我只想快速从我的工作中删除不必要的步骤/依赖项。
我在开发过程中使用AddressSanitizer来查找 C 代码中段错误和其他问题的原因。我通过添加-fsanitize=address到我CFLAGS的 Makefile列表中来做到这一点。
现在,解决了所有这些问题后,如果我从编译中删除此标志,我将无法再编译我的代码,并且会出现许多与此问题中描述的错误非常相似的错误...
~/xxx/util.c:20:对
__asan_option_detect_stack_use_after_return' /usr/bin/ld: ~/xxx/util.c:20: undefined reference to__asan_stack_malloc_2' usr/bin/ld 的未定义引用:/xxx/util.c:23:对__asan_report_store8' /usr/bin/ld: /xxx/util.c:40: undefined reference to__asan_report_load8' /usr/bin/ld 的未定义引用:/xxx/util.c:45 :对`__asan_report_load8'的未定义引用/usr/bin/ld:等等。
不同的是我只想正常编译我的代码。在那个问题中,他们建议-lasan在链接/编译步骤中添加一个标志。这似乎不会帮助我停止使用-fsanitize,尽管我可能是错的。显然这里的链接步骤有问题。感觉就像我在某处忘记了一个依赖项,但我不记得这样做了。
我错过了什么?大概是很明显的事情。另外,如果我需要提供有关编译步骤的更多信息,请告诉我。
每当我收到Segmentation Fault错误时,我都知道我正在访问"不属于我"的内存.
在一些非显而易见的情况下,我必须依赖调试工具,例如探查器(例如Valgrind).
不幸的是,在运行时,我只收到以下错误消息:
分段故障
没有别的.我的问题是:
为什么程序在运行时没有提供有关错误的更多信息?
Ps:这不是关于为什么发生分段错误错误的问题:我理解为什么.