【发布时间】:2021-12-16 02:39:21
【问题描述】:
技术上,subtracting a null pointer is undefined behaviour in C。 Clang 13 对其发出警告。
然而,这个结构无论如何都会被使用,通常用于确定指针的对齐方式。例如,qsort 的 BSD 派生实现使用它。见here (OpenBSD) 和explanation of what it's for:
从 OpenBSD 中减去空指针的代码示例片段。请参阅上面的链接以获取完整的上下文。
#define TYPE_ALIGNED(TYPE, a, es) \
(((char *)a - (char *)0) % sizeof(TYPE) == 0 && es % sizeof(TYPE) == 0)
问题:这样的代码在典型的现代平台(64 位或 32 位)上使用典型的现代编译器是否安全?许多著名的生产代码似乎多年来一直使用这种结构。
我注意到像这样的代码已被删除from FreeBSD's qsort(请参阅修订版334928),因为 GCC 错误编译了其中的一些。但是,我不了解问题的discussion 中的所有细节,并且我无法判断问题是否是空指针减法的直接后果。但是,their proposed fix 基本上消除了空指针减法。我将不胜感激有关该主题的一些澄清。
【问题讨论】:
-
请提供演示问题的相关代码,而不是提供参考。
-
@VladfromMoscow 有几个相关代码的链接,包括 StackOverflow 的链接。
-
从描述中不清楚是什么问题。
-
你写了“这样的代码可以安全使用吗...”什么代码?您的问题中的代码在哪里?
-
在您讨论该问题的链接中,我没有看到关于减法
(char *) 0的讨论,至少不是直接的。是不是和那里有什么联系?哪个特定文本讨论了减法,您对此有疑问吗?那里的一些文字提到代码违反了别名规则,这不是我描述(char *) a - (char *) 0的方式。
标签: c alignment undefined-behavior null-pointer