即使指针从未被解除引用,如何在三个过去的指针中发生硬件陷阱?

Tho*_*day 7 c++ cpu-architecture pointer-arithmetic hardware-traps

2005年11月1日的C++专栏中,Herb Sutter写道......

int A[17];
int* endA = A + 17;
for( int* ptr = A; ptr < endA; ptr += 5 )
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

[O]在某些CPU架构(包括当前的架构)中,上述代码可能导致硬件陷阱发生在创建三个结束指针的位置,无论该指针是否被解除引用.

如何在bitpattern上捕获CPU?关于什么 ...

int A[17];

// (i) hardware will trap this ?
int *pUgly = A + 18; 

// (ii) hardware will trap this, too?
int *pEnd = A + 17;
++pEnd;  

// (iii) will this fool it?
int *precious = A + 17;
unsigned long tricksy = reinterpret_cast<unsigned long>(precious) ; 
++tricksy;
int *pHobbits = reinterpret_cast<int *>(tricksy); 
Run Code Online (Sandbox Code Playgroud)

额外问题:"一些当前的CPU体系结构"这个短语是否应该被理解为仅仅指代运输产品,或者它是否包含虚构的体系结构,如果它们被描述或暗示的虚构作品具有最近的出版日期?

sha*_*oth 5

指针操作依赖于实现.

可能发生在某些平台上仅允许特定寄存器存储指针值(仅特定寄存器可用作索引寄存器),并且立即检查由非特权程序代码写入此寄存器的值是否为有效地址.在这种情况下,如果指针值对应于程序的地址空间中不存在的地址,则肯定会发生硬件陷阱.

如果是这种情况,编译器未优化的任何代码都会为指针分配新值,这可能会导致陷阱.

  • 确定主义者博尔赫斯写道,有三种动物:可以触摸的动物,只能从很远的地方看到的动物,以及那些只能从其他人的故事中学习的动物.我的问题是这些CPU如何处理陷阱,因此真正的CPU技术文档将具有指导意义. (2认同)