Cosa succede quando si usa l'indirizzo prima che venga assegnato?

3

La parte molto semplice del codice C ++ qui sotto non è corretta, è facile capire perché e strumenti come Valgrind te lo diranno. Nell'esecuzione di diversi codici C ++ contenenti questo tipo di errore, ho notato che ogni volta si concludeva con un Segmentation fault sulla linea che tenta di utilizzare l'indirizzo.

Quindi la mia domanda è: è sicuro affermare che il tentativo di utilizzare un indirizzo prima che venga assegnato sarà inevitabilmente portare a Segmentation violation nella riga corrispondente?

class ClassType
{
  public:int data_;
};

....
// Using address before it's allocated
ClassType * ClassType_ptr;
int x = ClassType_ptr->data_;
    
posta SebGR 19.02.2013 - 11:51
fonte

2 risposte

22

No, assolutamente no . Se questo fosse ciò che accade invariabilmente, potremmo usarlo a nostro vantaggio e specificarlo nello standard; Il comportamento noto , anche se si tratta di un arresto anomalo, è praticamente sempre migliore del comportamento sconosciuto .

Invece, la risposta del sistema dipende dai dettagli dell'implementazione, dalle precedenti azioni del programma, dallo stato del runtime ecc. in modo imprevedibile. Nei sistemi operativi moderni che fanno riferimento a un indirizzo che non appartiene a te, solitamente attiva una violazione di segmentazione, ma sicuramente non sempre. Potrebbe verificarsi una violazione della segmentazione, ma non molto tempo dopo. Ancora peggio, il tuo programma potrebbe sembrare funzionare ma silenziosamente fare la cosa sbagliata. Ecco perché lo standard di linguaggio deve prendere la peggiore opzione possibile e dichiarare che il comportamento è non definito .

(Si noti che la bontà dipende dal punto di vista.Per l'implementatore del compilatore, il comportamento indefinito è buono perché significa che qualunque cosa tu faccia è, per definizione, giusta.Per il programmatore di applicazioni è cattivo, perché porta a errori di applicazione, e persino al tipo di errori particolarmente insidiosi in cui le cose a volte funzionano e poi falliscono in modo spettacolare nel momento meno opportuno.)

    
risposta data 19.02.2013 - 11:59
fonte
3

La macchina e il sistema operativo ho prima fatto alcune programmazioni in C ++ su cui nemmeno ho errori di segmentazione perché non aveva alcuna protezione di memoria.

Se ricordo correttamente, su quella piattaforma, lo snippet di codice avrebbe inizialmente ClassType_ptr come 0, e il dereferenziamento avrebbe (senza errore) restituire i primi quattro byte di RAM come numero intero. Non è quello che volevi, sicuramente, ma nessun incidente, nessun errore.

Ecco perché, come diceva Kilian Foth nella risposta di cui sopra, il comportamento non è definito.

    
risposta data 19.02.2013 - 12:02
fonte

Leggi altre domande sui tag