Puntatori ANSI C valori danneggiati [chiuso]

0

Sto lavorando su ANSI C e ho alcuni problemi con i puntatori.

È così che dopo un punto nel mio programma i valori del puntatore cambiano senza che io interferisca, è qualcosa come sovrascriverli.

So che questo potrebbe accadere in C, ma pur essendo un principiante, non riesco a trovare un rimedio per questo.

C'è un modo semplice per risolvere questo? Come ho capito, molte persone avranno affrontato problemi simili.

Grazie ragazzi per le vostre risposte, sono stati molto utili, è stato davvero un problema di memoria risolto assegnando solo più grandi blocchi di memoria !!! Grazie ancora!!!!

    
posta Giwrgos Rizeakos 06.02.2014 - 16:03
fonte

3 risposte

4

Puoi fare diverse cose. Su un'applicazione a 32 bit non modificata in Windows potresti essere in grado di utilizzare DrMemory .

(Presumo che tu abbia già configurato il tuo compilatore per emettere tutti gli avvertimenti possibili. Non sottovalutare mai i potenziali problemi che si nascondono dietro un "avvertimento").

Puoi anche portare il tuo programma su Linux (forse su una macchina virtuale VMware, forse) e usare Valgrind . Quindi, non appena esegui il programma, verrai informato di una serie di possibili errori nel codice, completi di nome file, numero di riga e descrizione.

Infine, ci sono "librerie di controllo della memoria" ( eFence , ma ce ne sono altre) che compilerai / collegherai con il tuo programma ANSI C e sostituirai la maggior parte dei modi in cui potresti rovinare la memoria. A volte dovrai anche includere chiamate ad alcune funzioni di controllo, in modo che il tuo codice diventi qualcosa come:

CHECKPOINT
at = getAnotherTree(i++, info);
CHECKPOINT

Quindi, se esegui una chiamata standard difettosa in getAnotherTree() , riceverai un errore come

treebuild.c at line 597: strcpy: attempt to copy 192 bytes into 128-byte buffer
ABORTING

e se lo fai a mano, per esempio con

for (i = 0; i < bufSize; i++) {
    buffer[i] = 0;
}

quindi il secondo punto di controllo genererà un errore come

treebuild.c at line 1080: CHECKPOINT FAILURE

quindi individuando la fonte dell'errore in qualcosa nel flusso del programma tra l'ultimo checkpoint valido e l'altro fallito.

    
risposta data 06.02.2014 - 16:36
fonte
2

Se i valori sono stati modificati e non hai scritto intenzionalmente codice per cambiarli, allora con tutta probabilità, stai scrivendo su un array e sovrascrivendo il buffer. Questo può fare ogni sorta di cose. Di solito vedrai chiamate che non hai intenzione di chiamare o di non essere chiamato, ecc ... Tuttavia, può anche danneggiare i tuoi dati. Vorrei investigare attentamente tutti i tuoi memcpy, memmove, strcpy e i loop di array e vedere se trovi qualcosa. Sono abbastanza sicuro, solo guardando gli avvisi del compilatore ti dirò cosa sta succedendo. A Msft piace lamentarsi dell'uso delle vecchie funzioni c che non erano sicure.

Per evitare questo problema, SEMPRE eseguire controlli di intervallo sugli array.

Questo potrebbe non essere il problema, ma sembra il più probabile. Se desideri altri suggerimenti, dobbiamo vedere un codice.

In risposta alla tua modifica. L'allocazione di più memoria semplicemente nasconde i sintomi. Hai un bug nel tuo codice in cui non stai controllando i limiti degli array correttamente prima di scriverci. Risolvi il bug, il tuo problema non è stato risolto fino a quando non lo hai fatto.

    
risposta data 06.02.2014 - 16:34
fonte
0

Il bug puntatore più comune tra i principianti sembra provare a memorizzare un valore in un puntatore che non punta verso una posizione di memoria valida.

Esempio tipico:

char* ptr;  // initialized pointer, could point anywhere
*ptr = something; // bug, the program tries to write to "anywhere"

Quasi tutti i bug dei principianti sono diversi gusti di quanto sopra.

La buona notizia è che tali bug sono abbastanza facili da rintracciare. Basta un solo passo con un debugger fino a quando il programma si blocca. La linea in cui è andato in crash è molto probabilmente quella sbagliata.

    
risposta data 07.02.2014 - 14:47
fonte

Leggi altre domande sui tag