Tag: null pointer

符合C标准的方式来访问空指针地址?

在C中,引用空指针是未定义行为,但是空指针值具有位表示,在某些体系结构中它使其指向有效地址(例如,地址0)。 为了清楚起见,我们将此地址称为空指针地址 。 假设我想在C中编写一个软件,在一个无限制访问内存的环境中。 假设我想在空指针地址处写一些数据: 我将如何以标准兼容的方式实现这一点? 示例案例(IA32e): #include int main() { uintptr_t zero = 0; char* p = (char*)zero; return *p; } 当使用带有-O3的 gcc与IA32e编译时,此代码将转换为 movzx eax, BYTE PTR [0] ud2 由于UB(0是空指针的位表示)。 由于C接近低级编程,我相信必须有一种方法来访问空指针地址并避免UB。 只是要清楚 我问的是标准对此有何看法,而不是如何以实现定义的方式实现这一点。 我知道后者的答案。

在C中明显的NULL指针取消引用实际上是指针算术吗?

我有这段代码。 它似乎在这里取消引用空指针,但随后使用unsigned int对结果进行按位与运算。 我真的不明白整个部分。 它打算做什么? 这是指针算术的一种forms吗? struct hi { long a; int b; long c; }; int main() { struct hi ob={3,4,5}; struct hi *ptr=&ob; int num= (unsigned int) & (((struct hi *)0)->b); printf(“%d”,num); printf(“%d”,*(int *)((char *)ptr + (unsigned int) & (((struct hi *)0)->b))); } 我得到的输出是44.但它是如何工作的?

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

它在我看来像下面的程序计算一个无效的指针,因为除了赋值和比较的平等之外, NULL是没有好处的: #include #include 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标志能够动态检查生成的代码中的良好定义。 这是他们应该抓住的东西吗?

取消引用空指针在sizeof操作中有效

我遇到了一段代码片段,对我来说应该会因为分段错误而崩溃,但它可以毫无障碍地工作。 有问题的代码加上相关的数据结构如下(上面找到相关的评论): typedef struct { double length; unsigned char nPlaced; unsigned char path[0]; } RouteDefinition* Alloc_RouteDefinition() { // NB: The +nBags*sizeof.. trick “expands” the path[0] array in RouteDefinition // to the path[nBags] array RouteDefinition *def = NULL; return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0])); } 为什么这样做? 我认为char *的大小将解析为给定体系结构上指针的大小,但是在取消引用NULL -pointer时不应该崩溃和刻录?