相关疑难解决方法(0)

指针算术

有没有人对指针算术有任何好的文章或解释(博客,例子)?图中的观众是一群学习C和C++的Java程序员.

c pointers pointer-arithmetic

58
推荐指数
3
解决办法
8万
查看次数

是对空指针未定义行为执行算术?

它看起来像下面的程序计算一个无效的指针,因为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标志能够动态检查生成的代码中的良好定义.这是他们应该抓住的东西吗?

c c++ null-pointer undefined-behavior language-lawyer

18
推荐指数
3
解决办法
3456
查看次数