在我看来,下面的程序计算了一个无效的指针,因为NULL
除了赋值和比较相等之外没有任何用处:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *c = NULL;
c--;
printf("c: %p\n", c);
return 0;
}
但是,GCC 或 Clang 中针对未定义行为的警告或工具似乎都没有表明这实际上是 UB。该算法是否真的有效并且我太迂腐了,或者这是我应该报告的检查机制的缺陷?
测试:
$ clang-3.3 -Weverything -g -O0 -fsanitize=undefined -fsanitize=null -fsanitize=address offsetnull.c -o offsetnull
$ ./offsetnull
c: 0xffffffffffffffff
$ gcc-4.8 -g -O0 -fsanitize=address offsetnull.c -o offsetnull
$ ./offsetnull
c: 0xffffffffffffffff
Clang 和 GCC 使用的 AddressSanitizer 似乎有很好的记录,它更专注于对坏指针的取消引用,所以这很公平。但其他检查也没有抓住它:-/
编辑:我问这个问题的部分原因是这些-fsanitize
标志可以动态检查生成的代码中的明确性。这是他们应该抓住的东西吗?