Che tipo di bug puntatore è questo in particolare?

1

Il video più recente di UncommentatedPannen (pannenkoek2012) descrive un problema tecnico nel gioco per Nintendo 64 Super Mario 64 , che permette ad un oggetto di spingere Mario fuori dai limiti, cosa che normalmente non è possibile, utilizzando un puntatore stantire / penzolante nella struttura di Mario che normalmente punta il pavimento che Mario è attualmente sopra.

Pannen usa il termine "stantio", ma penso che potrebbe anche essere considerato penzolante, anche se non penso né descrivono completamente come si comportano Mario e questo puntatore.

Definizioni tratte dai loro articoli su Wikipedia:

Puntatore stantio

If several pointers address (are "aliases for") a given chunk of storage, it may happen that the storage is freed or reallocated (and thus moved) through one alias and then referenced through another

Puntatore appuntito

Dangling pointers arise during object destruction, when an object that has an incoming reference is deleted or deallocated, without modifying the value of the pointer, so that the pointer still points to the memory location of the deallocated memory. The system may reallocate the previously freed memory, and if the program then dereferences the (now) dangling pointer, unpredictable behavior may result, as the memory may now contain completely different data.

Non è un puntatore obsoleto perché entrambi i piani non sono né liberati né riallocati, ma il puntatore "piano" di un altro oggetto (Mario) non riesce ad aggiornarsi, permettendo a Mario di muoversi secondo la fisica del gioco mentre interagisce con un piano come se era un piano diverso.

Non è strettamente un puntatore penzolante perché è comunque garantito puntare a un triangolo di piano valido che è ancora assegnato. Il problema si verifica perché sta puntando al triangolo del pavimento sbagliato , un triangolo del pavimento precedente.

    
posta 0xFFF1 15.06.2017 - 05:03
fonte

1 risposta

3

There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton

Vedi link

Quello che stai descrivendo è una forma della prima: invalidazione della cache, se la si prende nel senso più ampio. Nel senso più ampio, è un errore invalidare o aggiornare una copia non autorevole di informazioni che è altrimenti derivabile.

Nel calcolo, usiamo una cache, generalmente per le prestazioni. Una cache memorizza una copia delle informazioni e generalmente non è la fonte autorevole di tali informazioni: qualcos'altro è! In genere, la cache si trova a una distanza dalla sorgente autorevole, il che significa che la cache e la fonte autorevole possono essere temporaneamente fuori sincrono causando problemi. In altri casi, la cache può diventare non sincronizzata a causa di errori logici nella programmazione (ad esempio, l'invalidazione non si verifica in modo appropriato).

Tuttavia, esistono molti tipi di copie di informazioni che costituiscono il caching, senza necessariamente separazione di distanza / rete. Una forma è quella in cui viene mantenuto un conteggio che sarebbe altrimenti derivabile dai dati memorizzati, ma, ancora una volta, per ragioni di prestazioni, viene mantenuto separatamente.

Questo è che c'è una copia delle informazioni, il puntatore di livello, che erroneamente non viene aggiornato quando dovrebbe essere. Si tratta, in sostanza, di un errore nell'aggiornamento delle informazioni memorizzate nella cache: una copia non autorevole di informazioni (il puntatore) che avrebbe potuto essere calcolata, ma che è stata acquisita / memorizzata per il miglioramento delle prestazioni.

Se dobbiamo, suppongo, possiamo considerare l'invalidazione della cache un sottoinsieme del problema di mantenere le copie aggiornate (poiché a volte l'aggiornamento è richiesto e l'invalidazione più semplice non è disponibile), anche se penso che entrambi siano principalmente essere nella stessa categoria di problemi.

Quindi, come dice Phil, è un problema nella categoria di invalidazione della cache.

Possiamo anche equiparare copie di dati con le nozioni di denormalizzazione. La denormalizzazione è una forma di memorizzazione nella cache, per prestazioni, che introduce copie degli stessi dati, che possono portare a problemi di coerenza, in quanto i dati denormalizzati possono essere soggetti a questi tipi di errori logici (tutti coloro che aggiornano i dati devono anche aggiornare tutte le copie dove mai sono o altro!). (Nei dati denormalizzati, potrebbe essere difficile persino determinare quali dati sono la fonte autorevole!)

Direi che questo costituisce un altro caso di dati copiati / copiati che non contengono le informazioni giuste, che evoca la nozione di invalidazione cache errata (aggiornamento cache / copia non corretto).

Da questo punto di vista, stantio è un termine operativo, più che penzolare, qui, tuttavia questa stoltezza non implica necessariamente la memoria libera come nella tua citazione.

    
risposta data 15.06.2017 - 06:25
fonte

Leggi altre domande sui tag