UBSan和Asan与GCC 4.9.2一起使用

时间:2015-08-04 09:30:58

标签: c++ gcc undefined-behavior address-sanitizer ubsan

我使用-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。

1 个答案:

答案 0 :(得分:5)

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

  

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

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

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

使用-fsanitize=undefined运行时会输出( see it live ):

  

运行时错误:对于32位类型,移位指数32太大&#39; int&#39;

GCC在Options for Debugging Your Program or GCC section中记录了此选项,并说:

  

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

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