Ho il seguente frammento di codice C e devono identificare l'errore e suggerire un modo di scriverlo in modo più sicuro:In che modo questo frammento C può essere scritto in modo più sicuro?
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Quindi l'errore è che strlen ignora la finale '\0'
di una stringa e quindi non è verrà assegnata una quantità di memoria sufficiente per la copia, ma non sono sicuro di cosa stiano per scrivere in modo più sicuro?
Potrei semplicemente usare malloc(strlen(somestring)+1))
presumo ma sto pensando che ci deve essere un modo migliore di quello?
EDIT: OK, ho accettato una risposta, ho il sospetto che la soluzione strdup non ci si aspetterebbe da noi perché non è parte di ANSI C. Sembra essere un bel questione soggettiva così ho non sono sicuro che quello che ho accettato sia effettivamente il migliore Grazie comunque per tutte le risposte.
+1 per l'uso di strncpy. Questa è la fonte di così tante falle nella sicurezza, non è divertente. –
L'utilizzo di strncpy() è in modo peggiore rispetto all'utilizzo non corretto di strcpy(). Se usi strncpy(), sei * NOT * output con terminazione null (questo esempio è OK, ma non in generale). Inoltre, se si utilizzano buffer di dimensioni eccessive e sizeof (buffer) per il terzo parametro per strncpy(), si ha un mini-disastro delle prestazioni a portata di mano; strncpy() azzera zeriosamente i dati copiati su tutta la lunghezza. * SÌ * alla conoscenza della lunghezza delle stringhe di origine e di destinazione; se lo fai correttamente, usare strcpy() è sicuro e più sicuro dell'uso cieco di strncpy(). (Se c'è qualche aiuto, strncat() è molto, molto peggio di strncpy(), non usarlo mai!) –
Jonathan, strlcpy() è molto più sano di mente. Lo uso ogni volta che è disponibile, ea volte porto una versione quando non lo è. Il Drepper è troppo cattivo. – dwc