据我所知,在C中获取有效的可解引用指针的唯一方法是使用malloc
和alloc
类函数并获取全局,静态或局部变量的地址。
现在,假设我们坚持使用特定平台和目标 - X86_64上的Windows。 指针类型在内部是64位无符号整数,CRT提供了一个名为VirtualAlloc的库函数,允许用户将页面映射到虚拟地址空间。
从标准C的角度来看,这是"好的"或未定义的行为?
因为似乎使用这些函数的简单程序会取消引用不是来自malloc
(或其他提到的有效来源)的指针。
还有unsigned long long
被投放到void*
的问题
或者标准中有一些规定允许平台特定功能具有特殊含义?
这可能非常迂腐,但我很困惑。
答案 0 :(得分:0)
使用任何未在C标准中定义的库函数,会引发未定义的行为 - 这几乎是一个重言式。标准没有定义这些函数的行为,因此必须定义它。
然而,实现完全可以自由地定义任何特定UB实例的行为。例如,实现“定位”Windows将定义一个库函数VirtualAlloc
,它像malloc
一样分配内存,并返回一个指向该内存的有效指针。程序完全可以完全依赖于特定实现的定义。按照标准的说法,这些程序符合但严格符合。
(定义{{1}}以重新格式化硬盘驱动器的假设实现仍然是C的一致性实现.Windows程序不应该在这样的实现上运行,但相反,编写的程序是期望的VirtualAlloc
重新格式化硬盘不应该在Windows上运行。)