我使用-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。
答案 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有关。