Questa è una sorta di domanda complementare a Come proteggere al meglio da 0 passati a parametri std :: string? . Fondamentalmente, sto cercando di capire se c'è un modo per far sì che il compilatore mi avvisi se un percorso di codice proverebbe incondizionatamente a chiamare std::string
di char*
costruttore con NULL
.
I controlli del tempo di esecuzione sono tutti buoni e positivi, ma per un caso come:
std::string get_first(const std::string& foo) {
if (foo.empty()) return 0; // Or NULL, or nullptr
return foo.substr(0, 1);
}
è fastidioso, anche se il codice è garantito fallire se si esercita quel percorso di codice, e l'intestazione di sistema è solitamente annotata con la precondizione che dice che il puntatore non deve essere nullo, questo ancora passa la compilazione sotto gcc
, clang
, ecc., anche con -std=c++11 -Wall -Wextra -pedantic -Werror
. Posso bloccare il caso specifico di 0
su gcc
con -Werror=zero-as-null-pointer-constant
, ma ciò non aiuta con NULL
/ nullptr
ed è una specie di affrontare il problema correlato ma dissimile. Il problema principale è che un programmatore può commettere questo errore con 0
, NULL
o nullptr
e non notarlo se il percorso del codice non viene esercitato.
È possibile forzare questo controllo a compilare il tempo, coprendo un'intera base di codice, senza sciocchezze come sostituire std::string
con una speciale sottoclasse in tutto il codice?