Вопрос по c++ – Как происходит аппаратное прерывание в указателе «три за концом», даже если указатель никогда не разыменовывается?

7

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

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

[O]n some CPU architectures, including current ones, the aforementioned code can cause a hardware trap to occur at the point where the three-past-the-end pointer is created, whether that pointer is ever dereferenced or not.

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

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

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

Разве это не четыре за концом, точно так же, как конец А - один за концом? Adrian Panasiuk

Ваш Ответ

2   ответа
5

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

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

Есть некоторые, как сказал Саттер, "включая текущие". Я не помню никаких имен, но знаю, что они существуют. Они не очень распространены, хотя. Но в нескольких архитектурах используются отдельные регистры для указателей и данных, что упрощает обнаружение неверной адресации. Имеет ли значение, существует ли такая платформа? Просто не делай этого. ;)
Я не смог найти никаких доказательств того, что Motorola 68000 будет ловить по незаконным адресам. Thomas L Holaday
Аутор Борхес, известный специалист, писал, что есть три вида животных: те, к которым можно прикоснуться, те, которых можно увидеть только на большом расстоянии, и те, о которых можно узнать только из рассказов других людей. Мой вопрос заключается в том, как эти процессоры делают ловушку, поэтому техническая документация реального процессора была бы поучительной. Thomas L Holaday
Вы уже получили ответ, хотя. Если ЦП имеет специальные «регистры адресов», в которых выполняется арифметика указателей, то он может между каждой инструкцией проверять, что значение, хранящееся в этом регистре, на самом деле является допустимым адресом, и генерировать аппаратную ловушку, если это не так. , По крайней мере, он может легко обнаружить переполнение, которое может произойти, если вы пройдете конец массива. У Motorola 68000 были такие отдельные регистры адресов, но я не знаю, будет ли он генерировать ловушки на незаконных адресах.
Существуют ли такие платформы или это не так? Не используйте этот экскаватор, если вы находитесь в Облачном городе Беспин & quot; ? Thomas L Holaday
3

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

Нет, это не проблема. Смысл умозрительных чтений заключается в том, что они являются оптимизациями, и ничем иным. Если адрес, который они пытаются прочитать, запрещен, они просто не читают его.
+1 для поискового запроса. Thomas L Holaday
@jalf: Разве это не просто еще один способ сказать, что аппаратная ловушка не имеет видимых последствий? MMU будет по-прежнему представлен виртуальным адресом, который не преобразуется в физический адрес и который должен быть передан обратно тем или иным способом.

Похожие вопросы