2015-10-05 18 views
10

La maggior parte dei programmatori C conosce la funzione strdup. Molti di loro lo danno per scontato, ma non fa parte dello standard C (né C89, C99 né C11). Fa parte di POSIX e potrebbe non essere disponibile su tutti gli ambienti. Infatti, Microsoft ha insistito per rinominarlo _strdup, aggiungendo alla confusione.Qual è la logica per non includere strdup nello standard C?

è piuttosto facile da definire in questo modo (in C):

#include <string.h> 

char *strdup(const char *s) { 
    size_t size = strlen(s) + 1; 
    char *p = malloc(size); 
    if (p) { 
     memcpy(p, s, size); 
    } 
    return p; 
} 

Ma anche i programmatori esperti può facilmente sbagliare.

Inoltre, ridefinendo la funzione solo su sistemi che non dispongono si dimostra un po 'complicato come spiegato qui: strdup() function

Perché non includere tali utili funzioni ampiamente supportate nelle edizioni rivedute del Gruppo C Standard? Sono state aggiunte molte nuove funzioni nella libreria C standard in C99, qual è la motivazione per non includere strdup?

+1

@AlterMann: 'malloc' e gli amici sono sempre stati parte dello standard C. 'aligned_alloc' è stato aggiunto in C11,' malloc' è menzionato su 11 pagine nello standard C11, puoi spiegare cosa intendi? – chqrlie

+0

[Perché malloc() è dannoso nei sistemi embedded?] (Https://www.quora.com/Why-is-malloc-harmful-in-embedded-systems) –

+0

Penso che sia OffTopic per StackOverflow ... – LPs

risposta

13

Il collegamento citato nei commenti (http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm) dà una spiegazione su ciò che è "sbagliato" di avere strdup nella libreria standard:

Il problema principale era l'opportunità di aggiungere una funzione per la libreria standard che alloca automaticamente la memoria heap per l'utente.

Fondamentalmente, il linguaggio C e la sua libreria standard fanno del loro meglio per non fare supposizioni su come l'utente assegna e utilizza la memoria.
Fornisce alcune funzionalità tra cui lo stack e l'heap.

Mentre malloc/free sono standardizzati per l'allocazione dinamica della memoria, non sono affatto l'unico modo per farlo, poiché la gestione dinamica della memoria è un argomento molto complicato e la strategia di allocazione predefinita potrebbe non essere auspicabile per tutti i tipi di applicazioni .

Esistono ad esempio alcune librerie indipendenti come jemalloc che enfatizzano la frammentazione e la concorrenza ridotte o persino i garbage collector a pieno titolo come The Boehm-Demers-Weiser conservative garbage collector. Queste librerie offrono implementazioni malloc/free che devono essere utilizzate esclusivamente in sostituzione dell'assegnazione standard * e delle funzioni libere da <stdlib.h> senza compromettere la compatibilità con il resto della libreria standard C.

Quindi se strdup è stato reso standard, sarebbe effettivamente squalificato dall'essere utilizzato dal codice utilizzando funzioni di gestione della memoria di terze parti (si deve notare che la già citata libreria jemalloc fornisce un'implementazione di strdup per evitare questo problema).

Più in generale, mentre strdup è certamente una funzione pratica, soffre di una mancanza di chiarezza nella sua semantica. È una funzione dichiarata nell'intestazione <string.h>, ma per chiamarla è necessario liberare di conseguenza il buffer restituito chiamando la funzione free dall'intestazione <stdlib.h>. Quindi, è una funzione stringa o una funzione di memoria?
Lasciandolo nello standard POSIX sembra essere la soluzione più ragionevole per evitare di rendere meno chiara la libreria C standard.

+1

Capisco i tuoi argomenti, ma ritengo che questa risposta non sia molto convincente: 'strdup' è ampiamente usato al punto che molti programmatori C professionisti credono che sia parte dello Standard (chiedi ai tuoi sviluppatori). Tutte le implementazioni alternative della famiglia di funzioni 'malloc' forniscono anche una sostituzione per' strdup', il Boehm gc o qualsiasi altro non verrebbe sconfitto da 'strdup' come standard. Il problema dell'intestazione è un non-problema, nel peggiore dei casi 'strdup' potrebbe essere definito in' 'e' 'come già il caso di' NULL' definito in più file di intestazione standard. – chqrlie

+0

@chqrlie come eccezione che potrebbe funzionare, ma immaginate se le funzioni che utilizzano schemi di allocazione simili inizino a essere standardizzate, significherebbe che ogni implementazione malloc alternativa dovrebbe spedire la propria versione di queste funzioni e alla fine spedire la propria versione della C libreria standard. Quello sarebbe un incubo di manutenzione. – SirDarius

+0

Per completezza, 'null' è definito in' ',' ',' ',' ',' ',' ',' ' ... – chqrlie