Как происходит аппаратная ловушка в указателе «три за концом», даже если указатель не разыменовывается? - PullRequest
7 голосов
/ 29 июня 2009

В своей 1 ноября 2005 г. колонке C ++ Герб Саттер пишет ...

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

[O] n некоторые архитектуры ЦП, включая текущие, вышеупомянутый код может вызвать аппаратную ловушку в точка, где три-за-конец указатель создан, что ли указатель когда-либо разыменовывается или нет.

Как процессор перехватывает битовый паттерн? Как насчет ...

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); 

Дополнительный вопрос: следует ли понимать фразу «некоторые текущие архитектуры ЦП» как относящуюся только к отгрузочным продуктам, или она также включает в себя воображаемые архитектуры, если произведение художественной литературы, в котором они описаны или упоминаются, имеет недавнюю публикацию дата

Ответы [ 2 ]

5 голосов
/ 29 июня 2009

Операции с указателями зависят от реализации.

Может случиться, что на некоторых платформах для хранения значений указателей разрешены только определенные регистры (в качестве регистров индекса могут использоваться только определенные регистры), и значение, записанное в такой регистр непривилегированным программным кодом, немедленно проверяется на допустимость. адрес. В этом случае, если значение указателя соответствует адресу, отсутствующему в адресном пространстве программы, аппаратное прерывание обязательно произойдет.

Если это так, любой код, не оптимизированный компилятором, который присваивает новое значение указателю, потенциально может вызвать ловушку.

3 голосов
/ 29 июня 2009

Можно гуглить "умозрительные чтения". Как только адрес сформирован, для архитектуры кеша может оказаться целесообразным поместить соответствующий кеш данных в кеш. Как правило, это должно быть безвредно, но если вы значительно вышли за пределы (например, на следующую страницу), это может больше не быть правдой.

...