mmap和VirtualAlloc是否符合C标准?

时间:2017-04-17 17:38:03

标签: c undefined-behavior

据我所知,在C中获取有效的可解引用指针的唯一方法是使用mallocalloc类函数并获取全局,静态或局部变量的地址。

现在,假设我们坚持使用特定平台和目标 - X86_64上的Windows。 指针类型在内部是64位无符号整数,CRT提供了一个名为VirtualAlloc的库函数,允许用户将页面映射到虚拟地址空间。

从标准C的角度来看,这是"好的"或未定义的行为? 因为似乎使用这些函数的简单程序会取消引用不是来自malloc(或其他提到的有效来源)的指针。

还有unsigned long long被投放到void*的问题 或者标准中有一些规定允许平台特定功能具有特殊含义?

这可能非常迂腐,但我很困惑。

1 个答案:

答案 0 :(得分:0)

使用任何未在C标准中定义的库函数,会引发未定义的行为 - 这几乎是一个重言式。标准没有定义这些函数的行为,因此必须定义它。

然而,实现完全可以自由地定义任何特定UB实例的行为。例如,实现“定位”Windows将定义一个库函数VirtualAlloc,它像malloc一样分配内存,并返回一个指向该内存的有效指针。程序完全可以完全依赖于特定实现的定义。按照标准的说法,这些程序符合严格符合

(定义{{​​1}}以重新格式化硬盘驱动器的假设实现仍然是C的一致性实现.Windows程序不应该在这样的实现上运行,但相反,编写的程序是期望的VirtualAlloc重新格式化硬盘不应该在Windows上运行。)