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