我认为以下程序计算了一个无效的指针,因为NULL
只适用于赋值和比较相等性:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *c = NULL;
c--;
printf("c: %p\n", c);
return 0;
}
然而,在GCC或Clang中针对未定义行为的任何警告或工具似乎都没有指出这实际上是未定义行为。这个算术运算是否真的有效,而我又过于追求完美了?还是他们的检查机制存在缺陷,我应该报告?
已测试:
$ 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
标志可以启用对生成代码中定义良好性的动态检查。这应该是他们应该发现的吗?
char *
的值。不管怎样,NULL
并不总是定义为((void*)0)
(至少我从 C++ 的一些小问题中记得)。 - chris