【问题标题】:gcc ASAN doesn't stop on purported runtime errorgcc ASAN 不会因声称的运行时错误而停止
【发布时间】:2020-03-13 09:26:02
【问题描述】:

我希望地址消毒剂在捕获到某些东西时中止。我认为它是默认设计的,但它似乎对我不起作用。我也试过ASAN_OPTIONS=halt_on_error=1,但没有效果。以下是详细信息:

在我从事的一个项目中,我们使用了地址清理程序,它发出了这个警告/错误数周而没有人意识到这一点:

运行时错误:作为参数 xx 传递的空指针,它被声明为永远不会为空

尽管被称为运行时错误,但它不会停止程序或导致错误的退出代码。这是一个简单的程序来演示它:

/*
gcc -fsanitize=address,undefined \
    -Wformat \
    -Werror=format-security \
    -Werror=array-bounds \
    -g -o xasan xasan.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  fprintf(stderr, "before\n");
  memcpy(NULL, argc > 1 ? "" : NULL, argc > 1 ? 1 : 0);
  fprintf(stderr, "after\n");
  return 0;
}

argc 技巧只是让 gcc 不会优化 memcpy 调用,基本上在我们的代码中它最终会导致运行时错误/警告的 memcpy(dst, NULL, 0)

我希望在运行时错误之后不会输出'after',但它是并且程序退出代码为0。这是一个错误吗?手册说它应该停止。

【问题讨论】:

    标签: c gcc address-sanitizer


    【解决方案1】:

    如果不想重新编译,也可以用export UBSAN_OPTIONS=halt_on_error=1运行。

    【讨论】:

      【解决方案2】:

      原来的错误来自 UBSAN,答案是使用编译器开关 -fno-sanitize-recover,如 here 所示。

      【讨论】:

        猜你喜欢
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        • 2013-08-10
        • 2017-07-04
        相关资源
        最近更新 更多