49 votes

Erreur Clang sur "Potential null dereference".

Je continue à obtenir des erreurs Clang sur le type de code suivant et je n'arrive pas à comprendre pourquoi elles sont erronées ou comment les résoudre à la satisfaction de Clang :

+ (NSString *)checkForLength: (NSString *)theString error: (NSError **)error {
    BOOL hasLength = ([theString length] > 0);
    if (hasLength) return theString;
    else {
        *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil];
        return nil;
    }
}

En laissant de côté la nature totalement artificielle de l'exemple (auquel Clang s'est opposé, il est donc suffisamment illustratif), Clang s'oppose à la ligne d'affectation des erreurs avec l'objection suivante :

Déférence nulle potentielle. Selon les normes de codage de la section "Creating and Returning NSError Objects", le paramètre "error" peut être nul.

J'aime avoir un rapport Clang impeccable. J'ai lu le document cité et je ne vois pas comment faire ce qui est attendu ; j'ai vérifié certaines bibliothèques Cocoa open-source et cela semble être un idiome commun. Avez-vous des idées ?

99voto

Daniel Martin Points 9148

La façon de faire ce qui est attendu est indiquée dans le listing 3-5 de ce document. Avec votre exemple de code :

+ (NSString *)checkForLength: (NSString *)theString error: (NSError **)error {
    BOOL hasLength = ([theString length] > 0);
    if (hasLength) return theString;
    else {
        if (error != NULL) *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil];
        return nil;
    }
}

17voto

Jim Correia Points 4866

La convention Cocoa veut que la valeur de retour indique le succès ou l'échec (dans ce cas, vous renvoyez nil en cas d'échec) et l'erreur est complétée par des informations supplémentaires, mais uniquement lorsque l'appelant le demande.

En d'autres termes

NSError *error = nil;
NSString *result = [self checkForLength: aString error: &error];

et

NSString *result = [self checkForLength: aString error: NULL];

sont deux façons valables d'invoquer la méthode. Le corps de la méthode doit donc toujours vérifier si le paramètre d'erreur est NULL :

if (error != NULL)
    *error = ...;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X