2016-06-23 15 views
20

È sicuro inserire il puntatore NULL come parametro di strncmp se il terzo parametro è zero? Cioè invocazione come:È strNCmp (NULL, "foo", 0) ben definito?

strncmp(NULL, "foo", 0); 
+1

Non è che il compilatore ottimizzerà l'intera istruzione? –

+1

@SouravGhosh Forse ho semplificato troppo. Mi interessa il caso in cui tutti e tre i parametri sono variabili che ottengono quei valori in fase di esecuzione. – Marian

+3

@SouravGhosh: È possibile che il compilatore lo sostituisca con una chiamata alle armi per i migliori di Westeros, a causa dell'UB :) –

risposta

33

È undefined behavior.

C standard dice che non si dovrebbe passare invalidi alla funzione di libreria, in generale.

Citando C11, capitolo §7.24.1, "convenzioni funzione di stringa", (sottolineatura mia)

Dove un argomento dichiarato size_t n specifica la lunghezza della matrice per una funzione , n può avere il valore zero su una chiamata a quella funzione. Se non diversamente specificato nella descrizione di una particolare funzione in questo sottopunto, gli argomenti del puntatore in tale chiamata devono ancora avere valori validi, come descritto in 7.1.4. In tale chiamata, una funzione che individua un carattere non trova alcuna occorrenza, una funzione che confronta due sequenze di caratteri restituisce zero e una funzione che copia i caratteri copia zero caratteri .

e non vedo alcuna menzione specifica (come eccezione al suddetto vincolo) nella funzione 7.24.4.4, strncmp().


Per aggiungere contesto per "puntatori non validi", citando §7.1.4/p1, L'utilizzo di funzioni di libreria

[...] Se un argomento a una funzione ha un valore non valido (ad esempio un valore fuori del dominio della funzione, o un puntatore all'esterno dello spazio indirizzo del programma, o un puntatore nullo, o un puntatore nella memoria non modificabili quando il corrispondente pa rameter non è const-qualificato) o un tipo (dopo la promozione) non previsto da una funzione con numero variabile di argomenti, il comportamento non è definito. [...]

e relativo NULL, citando §7.19, <stddef.h>

NULL
che si espande ad un puntatore nullo definita dall'implementazione costante; [...]

+0

Un puntatore nullo è un puntatore "non valido"? –

+9

sì, è (in questo contesto) 7.1.4/1 "Se un argomento di una funzione ha un valore non valido (ad esempio un valore esterno al dominio della funzione o un puntatore al di fuori dello spazio indirizzo del programma o un puntatore nullo, o un puntatore alla memoria non modificabile quando il parametro corrispondente non è const-qualificato) " –

+2

Nice find ...... –

8

Da the C strncmp documentation at cppreference.com:

Il comportamento è definita quando sia lhs o rhs è il puntatore nullo.

Basta leggere la documentazione.

+17

http://cppreference.com non è la "documentazione", è un Wiki pubblico scritto dagli appassionati . Dato il tag [tag: language-lawyer], non penso che dovremmo prendere in considerazione altro che lo standard del linguaggio per essere un riferimento autorevole per questa domanda. –

+3

@NateEldredge: Non ho detto che era autorevole, né "la" documentazione (è "la documentazione su cppreference.com"). Ma fare alcune ricerche di base sarebbe stato un buon inizio. Il PO avrebbe quindi potuto chiedere la conferma su ciò che avevano già visto dichiarato. Inserisci lo standard e l'eccellente risposta di Sourav. Considero che ci sia valore nel ricordare alle persone di leggere la documentazione. –

+1

Grazie per la risposta. In realtà ero interessato al tipo di risposta che Sourav ha fornito (con il tuo prezioso commento). Volevo trovare dei motivi contro righe di codice sospette come questa. – Marian

Problemi correlati