什么-fsanitize = function(UndefinedBehaviorSanitizer)错误实际上是什么意思?

时间:2014-10-30 16:11:18

标签: clang llvm function-pointers

使用-fsanitize = function在ubuntu 14.04上使用clang 3.5编译MAME / MESS(https://github.com/mamedev/mame/)时,我遇到了很多错误:

src/lib/util/delegate.h:651:64: runtime error: call to function osd_file_output_callback(_IO_FILE*, char const*, __va_list_tag*) through pointer to incorrect function type 'void (*)(delegate_generic_class *, const char *, __va_list_tag *)'
/home/notroot/trunk/src/osd/osdcore.c:14: note: osd_file_output_callback(_IO_FILE*, char const*, __va_list_tag*) defined here

src/lib/util/delegate.h:649:42: runtime error: call to function rom_exit(running_machine&) through pointer to incorrect function type 'void (*)(delegate_generic_class *)'
/home/notroot/trunk/src/emu/romload.c:1514: note: rom_exit(running_machine&) defined here

我真的不明白这些错误意味着什么,因为如果函数签名不匹配,我希望应用程序在某些时候崩溃。到目前为止,没有人可以向我解释这个错误实际意味着什么或者为什么这样做有效。

1 个答案:

答案 0 :(得分:0)

  

我真的不明白这些错误是什么意思,因为如果函数签名不匹配,我希望应用程序在某些时候崩溃。

这就是未定义行为的危险。它确实意味着函数签名不匹配。这并不意味着它会崩溃,或者等到崩溃之前它看起来的老板,或腐败堆栈或诸如此类的东西。它甚至可能在今天完全不可观察,但不会与未来版本的编译器(或旧版本)。未定义的行为就是这样。你不能从观察到的行为中得出关于不存在未定义行为的结论。

在你的情况下,它没有崩溃,因为指向_IO_FILE和指向delegate_generic_class的指针大小相同,并且在ABI中没有任何特殊之处(假设是x86-64 linux)。