Ben*_*igt 13 c++ pointers language-lawyer
根据C++标准,每个实现都必须记录"实现定义的行为":
1.3.11
[defns.impl.defined]实现定义的行为行为,对于格式良好的程序构造和正确的数据,这取决于实现和每个实现文档
读取无效指针值具有实现定义的行为(请参阅4.1左值到右值转换[conv.lval]):
如果glvalue引用的对象包含无效指针值(3.7.4.2,3.7.4.3),则行为是实现定义的.
(引自n4527草案,但是"通过无效指针值间接并将无效指针值传递给释放函数的行为具有未定义的行为.无效指针值的任何其他使用都具有实现定义的行为."已经在3.7中. 4.2 [basic.stc.dynamic.deallocation]自至少草案n3485以来的释放功能
但是,许多流行的实现并未定义此行为,许多专家将此描述为"未定义的行为".
遗漏明确文件的一个可能原因是,据我所知,"附录后的标准草案"中出现的"实施定义行为指数"中缺少对"无效指针值"的评估.
这是标准中的缺陷吗?自C++ 14以来,是否有任何公开的缺陷报告或委员会行动?
CWG#1438改变了有关无效指针值的语义:
当前的标准规定,任何使用无效指针值都会产生未定义的行为(3.7.4.2 [basic.stc.dynamic.deallocation]第4段).这不仅包括取消引用指针,还包括获取其值.这种严格限制的原因在于,过去的一些体系结构使用专用地址寄存器用于指针加载和存储,并且如果例如指针中的段号当前未被映射,则它们可能会出错.
目前尚不清楚这些限制是否对目前正在使用或合理预见的架构是必要的.应调查此问题以查看是否可以放宽限制以仅应用于取消引用指针.
[conv.lval]的变化是CWG#616的分辨率,它基本上采用了上述方法.
将这一点从UB提升为实施定义的行为是故意的,因此我认为指数中缺少这一段是一种疏忽.