cocoa clang-static-analyzer

cocoa - Clang Error en "Deferencia nula potencial".



clang-static-analyzer (2)

La convención de Cocoa es que el valor de retorno debe indicar el éxito o el fracaso (en este caso, devuelve nulo en caso de error) y el error se completa con información adicional, pero solo cuando la persona que llama lo solicita.

En otras palabras

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

y

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

son formas válidas de invocar el método. Por lo tanto, el cuerpo del método siempre debe buscar un parámetro de error NULL:

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

Sigo recibiendo errores de Clang en el siguiente tipo de código y no puedo entender por qué son erróneos o cómo resolverlos a satisfacción 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; } }

Dejando de lado la naturaleza totalmente artificial del ejemplo (que Clang objetó, por lo que es suficientemente ilustrativo), Clang rechaza la línea de asignación de error con la siguiente objeción:

Desreferencia nula potencial. De acuerdo con los estándares de codificación en ''Creación y devolución de objetos NSError '', el parámetro ''error'' puede ser nulo.

Me gusta tener un informe prístino de Clang. He leído el documento citado y no veo la manera de hacer lo que se espera; Revisé algunas bibliotecas de código abierto de Cocoa y esta parece ser una expresión común. ¿Algunas ideas?


La forma de hacer lo que se espera se muestra en la lista 3-5 en ese documento. Con tu código de ejemplo:

+ (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; } }