2009-06-29 5 views
7

In seiner November 1, 2005 C++ column, Herb Sutter schreibt ...Wie geschieht ein Hardware-Trap in einem Drei-nach-dem-Ende-Zeiger, selbst wenn der Zeiger niemals dereferenziert wird?

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

[O] n einige CPU-Architekturen, einschließlich aktuellen, verursachen die oben genannten Code kann ein Hardware-Falle bei der Punkt zu kommen, wo Der Drei-nach-dem-Ende-Zeiger wird erstellt, unabhängig davon, ob der Zeiger jemals dereferenziert wurde oder nicht.

Wie fängt eine CPU auf einem Bitmuster? Was ist mit ...

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

Bonus Frage: Sollte der Ausdruck „einige aktuelle CPU-Architekturen“ verstanden werden normalerweise nur zu Versandprodukte beziehen, oder ist es imaginären Architekturen auch wenn das Werk der Fiktion sind, in denen sie beschrieben oder angespielt haben, hat ein neues Veröffentlichungsdatum?

+1

ist es nicht vier-nach-dem-Ende genau wie endA ist eins-nach-dem-Ende? –

Antwort

5

Zeigeroperationen sind implementierungsabhängig.

Es kann vorkommen, dass auf einigen Plattformen nur spezifische Register zum Speichern von Zeigerwerten erlaubt sind (nur bestimmte Register können als Indexregister dienen) und der von einem nicht privilegierten Programmcode in dieses Register geschriebene Wert wird sofort auf a geprüft gültige Adresse Wenn in diesem Fall der Zeigerwert einer Adresse entspricht, die nicht im Adressraum des Programms vorhanden ist, wird die Hardware-Trap sicher auftreten.

Wenn dies der Fall ist, kann ein vom Compiler nicht optimierter Code, der einem Zeiger einen neuen Wert zuweist, möglicherweise einen Trap verursachen.

+1

Gibt es solche Plattformen oder ist das wie "Verwenden Sie diesen Bagger nicht, wenn Sie in der Cloud City von Bespin sind"? –

+1

gibt es einige, wie Sutter sagte, "einschließlich der aktuellen". Ich kann mich an keine Namen erinnern, aber ich weiß, dass sie existieren. Sie sind jedoch nicht sehr häufig. Aber verschiedene Architekturen haben getrennte Register für Zeiger und Daten verwendet, was es einfach macht, ungültige Adressen zu erkennen. Spielt es eine Rolle, ob solche Plattformen existieren? Tu es einfach nicht. ;) – jalf

+2

Der surrealist auuthor Borges schrieb, dass es drei Arten von Tieren gibt: jene, die berührt werden können, solche, die nur aus großer Entfernung gesehen werden können, und solche, die nur aus den Geschichten anderer Menschen gelernt werden können. Meine Frage ist, wie diese CPUs die Falle machen, also wäre eine technische Dokumentation einer echten CPU lehrreich. –

3

Sie könnten google "spekulatives Lesen". Sobald eine Adresse gebildet ist, kann es für die Cache-Architektur klug sein, die entsprechende Datenlinie in den Cache zu bringen. Normalerweise sollte dies harmlos sein, aber wenn Sie deutlich außerhalb der Grenzen sind (z. B. auf der nächsten Seite), ist dies möglicherweise nicht mehr der Fall.

+0

+1 für den Suchbegriff. –

+0

Nein, das ist nicht das Problem. Der springende Punkt ist, dass es Optimierungen sind, sonst nichts.Wenn die Adresse, die sie zu lesen versuchen, nicht verfügbar ist, liest sie sie einfach nicht. – jalf

+0

@jalf: Ist das nicht nur eine andere Art zu sagen, dass die Hardware-Falle keine sichtbaren Konsequenzen hat? Der MMU wird weiterhin eine virtuelle Adresse präsentiert, die nicht in eine physikalische Adresse aufgelöst wird und die auf die eine oder andere Weise zurück kommuniziert werden muss. – MSalters