Impostazione di un puntatore su NULL in caso di errore?

1

Ho modificato un codice scritto da un dipendente precedente e ho trovato una funzione con la seguente firma:

BOOL WINAPI PrependPadding(
    _In_ SIZE_T cbPadding,
    _In_ SIZE_T cbRow,
    _Out_writes_bytes_(cbPadding) _On_failure_(_Post_null_) BYTE *bRow
)

Per chi non ha familiarità con il metanaggio di annotazione SAL di Microsoft, le annotazioni su questa funzione indicano fondamentalmente che se la funzione non dovesse funzionare per qualsiasi motivo, il puntatore bRow sarà NULL dopo l'esecuzione di questa funzione.

Trovo che questo sia interessante perché impone che il chiamante debba controllare il valore di ritorno per successo / fallimento - se provi a fare qualcosa con bRow dopo che questa funzione ha avuto esito negativo, ovviamente si bloccherà.

Tuttavia, questa è generalmente una buona pratica? Non ho mai visto questo usato prima e mi chiedo se è per un motivo.

    
posta Govind Parmar 20.10.2017 - 22:06
fonte

2 risposte

2

L'indicazione dei guasti mediante il valore restituito è del tutto normale in C, tanto più che non esiste un'alternativa valida per segnalare errori.

D'altra parte, l'impostazione di un parametro out su NULL è molto meno comune e la sua validità dipenderebbe, a mio parere, da chi è responsabile della fornitura della memoria.

Se il chiamante di PrependPadding dovrebbe fornire un buffer sufficientemente grande come il parametro bRow , allora troverei molto strano se la funzione potesse cambiarlo in un puntatore NULL. Ciò renderebbe facile introdurre una perdita di memoria eliminando quello che potrebbe essere il mio unico riferimento a quel blocco di memoria.
Se, d'altra parte, PrependPadding è responsabile dell'allocazione della memoria alla quale% co_de si riferisce dopo che la funzione è tornata, sarebbe abbastanza naturale avere bRow come puntatore NULL in caso di errore.

    
risposta data 21.10.2017 - 09:53
fonte
2

Ad eccezione di setjmp () / longjmp (), C non fornisce un meccanismo di gestione delle eccezioni incorporato. Indicare errori nei valori di ritorno è di gran lunga il modo più comune di gestire gli errori in C.

    
risposta data 20.10.2017 - 22:57
fonte

Leggi altre domande sui tag