2009-07-27 29 views
46

tôi tiếp tục nhận lỗi Clang vào loại mã sau đây và tôi không thể tìm ra lý do tại sao họ đang sai lầm hoặc làm thế nào để giải quyết chúng để thỏa mãn Clang của:Lỗi Clang về "Ngưỡng rỗng tiềm năng".

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

Gác lại những tính chất hoàn toàn-giả tạo của ví dụ (mà Clang đã làm đối tượng để nó đủ minh họa), Clang balks tại đường phân công lỗi với các phản đối sau đây:

Tiềm năng rỗng dereference. Theo các tiêu chuẩn mã hóa trong 'Tạo và trả lại' NSError 'Tham số' lỗi 'của đối tượng có thể là rỗng.

Tôi thích có báo cáo Clang nguyên sơ. Tôi đã đọc tài liệu được trích dẫn và tôi không thể nhìn thấy một cách để làm những gì mong đợi; Tôi đã kiểm tra một số thư viện Cocoa nguồn mở và điều này có vẻ là một thành ngữ phổ biến. Bất kỳ ý tưởng?

Trả lời

95

Cách thực hiện những gì được mong đợi được hiển thị trong danh sách 3-5 trong tài liệu đó. Với mã ví dụ của bạn:

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

Rất tiếc, tôi không thể tin rằng mình đã bỏ lỡ điều đó. Cảm ơn! – bbrown

+0

Tôi đã sử dụng một triệu lần 'if (error) * error =…' thay vào đó, mà không có bất kỳ sự cố hoặc phân tích lỗi/cảnh báo nào. Tôi có thể tiếp tục theo cách này không? –

+0

Có, sự tương đương rõ ràng của một con trỏ null đến 0 và sai là mục tiêu C giữ nguyên từ C. Tôi cá nhân nghĩ rằng đó là kiểu xấu, nhưng vâng bạn chỉ có thể sử dụng 'if (error)' nếu bạn thực sự muốn. –

16

Quy ước Cocoa là giá trị trả về nên chỉ ra sự thành công hay thất bại (trong trường hợp này, bạn quay trở lại con số không cho thất bại) và các lỗi được điền vào với thông tin bổ sung, nhưng chỉ khi người gọi yêu cầu.

Nói cách khác

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

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

đều cách hợp lệ để gọi phương pháp này. Vì vậy, cơ thể phương pháp phải luôn kiểm tra thông số lỗi NULL:

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

Thực ra, nếu trình phân tích tĩnh của clang không phàn nàn về đoạn trích thứ hai của bạn, tôi sẽ gửi một lỗi :-) –

+0

Bạn đang đề cập đến đoạn mã NULL được chuyển cho lỗi param? Đây là một mẫu văn bản để sử dụng NSError. Xem . –

+0

Nếu tôi có thể đánh dấu hai câu trả lời, tôi sẽ có. Cảm ơn bạn đã giải thích ngữ cảnh trong đó nó có thể xảy ra! – bbrown

Các vấn đề liên quan