2009-07-27 20 views
46

Ben aşağıdaki kod türüne Clang hataları almaya devam ve onlar hatalı olduğunu anlamaya olamaz veya çınlama tatmin edecek şekilde bunları çözmek için nasıl: kaçındıkları-yapmacık doğasını kenara bırakırsakClang "Potansiyel boş değer dizisi" hatası.

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

potansiyel boş dereference: (bu yüzden yeterli açıklayıcı olduğunu için Clang nesnesi mi) örneği, Clang aşağıdaki itirazı hata atama hattında ana kirişler. 'NSError Nesneleri Oluşturma ve Geri Alma' kodlama standartlarına göre 'hata' parametresi boş olabilir.

Bozuk bir Clang raporunu beğeniyorum. Söz konusu belgeyi okudum ve beklenenleri yapmanın bir yolunu göremiyorum; Bazı açık kaynaklı Cocoa kütüphanelerini kontrol ettim ve bu genel bir deyim gibi görünüyor. Herhangi bir fikir?

cevap

95

Beklenenleri yapma yolu, bu belgede 3-5 listelemede gösterilir. örnek kodla birlikte:

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

Ugh, bunu özlediğime inanamıyorum. Teşekkürler! – bbrown

+0

Herhangi bir çökme veya analizör hatası/uyarısı olmaksızın milyonlarca kez “if (error) * error =…' kullandım. Bu şekilde devam edebilir miyim? –

+0

Evet, boş göstericinin 0 ve false açık eşitliği, düz eski C'den tutulan nesnel bir C nesnesidir. Şahsen bunun kötü bir stil olduğunu düşünüyorum, ancak evet eğer gerçekten isterseniz if (error) 'i kullanabilirsiniz. –

16

Kakao kongre ama, dönüş değeri (, başarısızlığa nil dönmek bu durumda) başarılı veya başarısız belirtmelidir ve hata ek bilgilerle doldurulur olmasıdır yalnızca arayan bunu ister. Başka bir deyişle

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

ve

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

yılında

yöntemi çağırmak için her iki geçerli yoludur. Bu nedenle, yöntem gövdesi her zaman bir NULL hata parametresini kontrol etmelidir:

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

Aslında, clang statik analizörü ikinci snippit'inizden şikayet etmezse, bir hata veriyorum :-) –

+0

Hata için NULL'un iletildiği snippet'i mi kullanıyorsunuz? param? Bu, NSError'ı kullanmak için belgelenmiş bir kalıptır. Bkz. . –

+0

İki yanıtı işaretleyebilirdim, olurdu. Olduğu bağlamı açıkladığınız için teşekkürler! – bbrown