相关疑难解决方法(0)

编译时未定义对“_asan_init_v4”的引用

链接我使用 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)

注意:我使用的是 …

linux address-sanitizer

14
推荐指数
2
解决办法
2万
查看次数

有没有办法验证我的程序没有内存泄漏?

我想确定以下程序(查找最大子数组的实现)是否泄漏内存。有没有通用的方法来确定这一点?例如使用调试器的某些功能?什么是一般策略?

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)

c memory debugging memory-leaks memory-management

6
推荐指数
1
解决办法
191
查看次数

调试堆栈值损坏的好方法

什么是调试堆栈值损坏的好方法。在我的程序中,有时在返回对文件描述符进行关闭的方法后,此指针的地址会更改。我调试了几个小时的程序,但找不到问题。

找出改变此指针地址的有效方法是什么?当我在此指针上手动添加监视时,不会发生错误。当我尽可能减少代码时,仍然会发生错误。我尝试了Valgrind,但未发现任何早期堆栈损坏。

我设法检测到何时发生错误,我以64位模式编译了代码。此地址从0xxxxxxx更改为0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,发现了地址更改的时间(有关此信息,请参见第一个段落)。

还有其他方法可以找出造成此问题的原因吗?

c++ linux debugging gcc stack-corruption

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

如何将 gcc 与 fsanitize=address 一起使用?

我正在尝试学习如何使用-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)

我误解/做错了什么?

c gcc memory-leaks

5
推荐指数
0
解决办法
3万
查看次数

使用 std::vector&lt;std::any&gt; 存储异构的 unique_ptrs

我想将不同类型的 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)

c++ c++20

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

GCC 是否具有检测释放后使用错误的功能?

这是我的代码片段:

#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 clang

4
推荐指数
1
解决办法
1024
查看次数

如何为多个C ++二进制文件启用地址清理器

我正在开发一种产品,该产品由多个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页面上找不到关于此的任何信息。

gcc address-sanitizer

2
推荐指数
1
解决办法
1878
查看次数

如何停止使用 AddressSanitizer?

我将在这里受到打击,因为我正在使用我不完全理解的工具,也没有花时间这样做。在这一点上,我只想快速从我的工作中删除不必要的步骤/依赖项。

我在开发过程中使用AddressSanitizer来查找 C 代码中段错误和其他问题的原因。我通过添加-fsanitize=address到我CFLAGS的 Makefile列表中来做到这一点。

现在,解决了所有这些问题后,如果我从编译中删除此标志,我将无法再编译我的代码,并且会出现许多与此问题中描述的错误非常相似的错误...

如何在 GCC 中使用 AddressSanitizer?

~/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,尽管我可能是错的。显然这里的链接步骤有问题。感觉就像我在某处忘记了一个依赖项,但我不记得这样做了。

我错过了什么?大概是很明显的事情。另外,如果我需要提供有关编译步骤的更多信息,请告诉我。

c gcc address-sanitizer

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

为什么我们在运行时没有提供有关Segmentation Fault的更多信息?

每当我收到Segmentation Fault错误时,我都知道我正在访问"不属于我"的内存.

在一些非显而易见的情况下,我必须依赖调试工具,例如探查器(例如Valgrind).

不幸的是,在运行时,我只收到以下错误消息:

分段故障

没有别的.我的问题是:


为什么程序在运行时没有提供有关错误的更多信息?


Ps:这不是关于为什么发生分段错误错误的问题:我理解为什么.

c++ segmentation-fault

0
推荐指数
1
解决办法
108
查看次数