2010-07-09 11 views
5

Nella programmazione C, ogni volta che provo a svolgere primo gatto volta, ho bisogno diImpostare il primo byte a 0 o l'uso memset a "resettare" intero buffer

TCHAR file_name[1024]; 
// Use memset or set the first byte to 0? 
file_name[0] = 0; 
_tcscat(file_name, TEMP_DIRECTORY_PATH); 
_tcscat(file_name, file); 

vedo maggior parte dei programmatori utilizzano memset. Ma, per me, ho appena impostato il primo byte su 0, per consentire a _tcscat di sapere da dove iniziare.

Non sono sicuro se c'è qualche lacuna/trappola per farlo, invece di utilizzare memset?

Grazie.

risposta

3

È possibile appena impostato il primo carattere a 0.

Tuttavia un modo ancora più semplice sarebbe quella di

TCHAR file_name[1024]; 
_tcsncpy(file_name, TEMP_DIRECTORY_PATH, 1024); 
_tcscat(file_name, file); 
1

Nessuno in realtà, diverso da quello che l'impostazione di tutto per i null può prevenire i bug più tardi, vale a dire se non si aggiunge uno per qualche motivo. È più semplice riempire l'intera stringa con zeri e sapere che non devi preoccuparti di aggiungere un terminatore null manualmente in seguito, a condizione che non si verifichi un overflow del buffer.

+0

Non sono d'accordo. È più probabile che nascondano bug nella logica che si aprirà improvvisamente quando qualcuno che mantiene il codice in seguito decide "hey, rimuoviamo tutti questi memeets inutili!" –

1

Impostazione l'intero buffer di caratteri NUL è una "difesa in profondità". Tale difesa copre un errore commesso altrove nel codice sorgente, forse da un programmatore diverso. In questo caso, l'errore a cui fare riferimento copia una stringa che si adatta al buffer, ma non copia il byte di terminazione NUL. Il buffer già zero fornirebbe NUL terminanti per questa copia stringa errata a "use". I programmatori differiscono sulla saggezza di "Defense in Depth" perché tale codifica può mascherare gli errori di programmazione che sono quindi ammessi a insinuarsi nel codice sorgente - essendo risolti solo molto tempo dopo che sono stati introdotti.

A mio parere personale, l'impostazione del buffer per tutti i caratteri NUL come questo come una "difesa in profondità" è uno spreco enorme. Avrebbe più senso solo il NUL il byte finale. Quindi gli errori verrebbero visualizzati, ma alla fine le stringhe verrebbero terminate. Una volta che si inizia a scendere su quel percorso di pensiero, la "difesa in profondità" avrebbe più senso se il buffer fosse reso più lungo da due parole macchina, e quelle parole fossero azzerate, e un valore canarino potrebbe riportare un superamento del tampone, e ....

O non si poteva solo invaso i buffer, e scrivere il programma in modo che si blocca più velocemente possibile se si fa. Questo è quello che mi piace fare.

+0

+1 per una buona analisi dei pro e contro delle diverse opzioni: –

4

Non sono d'accordo con la maggior parte delle risposte che sembrano indicare che l'impostazione della intera il buffer su 0 potrebbe essere utile. Se copi/concateni stringhe con terminazione nulla nel buffer, non è necessario cancellare l'intera faccenda: mi sembra uno spreco (anche se certamente potrebbe essere uno spreco di cui non vale la pena preoccuparsi).

Si potrebbe prendere l'approccio che Artelius suggested e utilizzare una variante strcpy() per ottenere la stringa iniziale nel buffer, ma penso che la simmetria del vostro approccio utilizzando strcat() `ha il merito pure (anche se credo che proprio l'impostazione il primo carattere a 0 è sufficiente).

Per inciso, se il buffer potrebbe contenere dati 'sensitve' (informazioni password o qualcosa del genere) - che potrebbero essere motivo di cancellare il tutto. Ma se questo è il caso, date un'occhiata a http://msdn.microsoft.com/en-us/library/ms972826 per alcuni motivi per cui memset() potrebbe non essere abbastanza.

+0

Davvero? Penso che sia piuttosto stupido impostare il buffer su zeri, ma suppongo che non si sia verificato nella mia risposta –

+0

E qualunque cosa tu faccia per zero memoria sicura, non memorizzarla nell'archivio protetto Microsoft ... Quella cosa è compatibile con CALEA, ovviamente. Scegli la tua parte, suppongo .. –

+0

Se vuoi la simmetria, potresti usare 'strcpy (s," "); per "inizializzare" la stringa e usare ancora 'strcat' per tutte le scritture appropriate. –