有没有人对指针算术有任何好的文章或解释(博客,例子)?图中的观众是一群学习C和C++的Java程序员.
它看起来像下面的程序计算一个无效的指针,因为NULL除了赋值和比较相等之外没有任何好处:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *c = NULL;
c--;
printf("c: %p\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,似乎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
Run Code Online (Sandbox Code Playgroud)
似乎很好地记录了Clang和GCC使用的AddressSanitizer更侧重于解除坏指针的引用,所以这很公平.但其他检查也没有抓住它: - /
编辑:我问这个问题的部分原因是-fsanitize标志能够动态检查生成的代码中的良好定义.这是他们应该抓住的东西吗?