2

我已经用-fsanitize=undefined选项编译了我的应用程序。我现在如何测试我的应用程序的未定义行为?

另外,如何进行 Asan 检查?我已经用 编译了我的程序-fsanitize=address,它崩溃并显示以下输出:

==4563==Sanitizer CHECK failed: ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:85 ((allocated < kCallocPoolSize)) != (0) (0, 0)

我在 Ubuntu 15.04 上安装了 GCC 4.9.2。

4

1 回答 1

5

与静态分析检查不同,此检查将在运行时完成,如以下博客条目中所述:GCC Undefined Behavior Sanitizer – ubsan。当它检测到未定义的行为时,它将输出运行时错误:

为了使用 ubsan 检查您的程序,请使用 -fsanitize=undefined 选项编译和链接程序。必须执行此类检测的二进制文件;如果 ubsan 检测到任何问题,它会输出“运行时错误:”消息,并且在大多数情况下会继续执行程序。有可能使这些诊断消息中止 - 只需使用选项 -fno-sanitize-recover。

我们可以从那里看到一个例子:

int main() {
    int i = 23;
    i <<= 32; 
}

运行时使用-fsanitize=undefined 将输出(实时查看):

运行时错误:移位指数 32 对于 32 位类型“int”而言太大

GCC 在他们的Options for Debugging Your Program 或 GCC 部分中记录了这个选项,它说:

启用 UndefinedBehaviorSanitizer,一个快速的未定义行为检测器。各种计算被用来检测运行时未定义的行为。

至于 asan 问题,这个address-sanitizer 文档为您提供了一个示例和预期的结果。也许你的情况与这个 gcc bug有关。

于 2015-08-09T01:32:17.533 回答