2013-07-22 1 views
6

코드 기반에서 Clang 오류를 정리하는 임무를 맡았습니다. 나는 iPhone 개발과 Objective C에 매우 익숙하지 만, 대부분의 문제는 사소한 것으로 나타났습니다.이 문제는 당황 스럽지만, 당황 스럽습니다. ZAttributedString 클래스에서 Objective-C : 'self'가 설정되지 않은 상태에서 인스턴스 변수가 사용되었지만,

는 :

- (id)initWithAttributedString:(ZAttributedString *)attr { 
    NSParameterAssert(attr != nil); 
    if ((self = [super init])) { 
     _buffer = [attr->_buffer mutableCopy]; 
     _attributes = [[NSMutableArray alloc] initWithArray:attr->_attributes copyItems:YES]; 
    } 
    return self; 
} 

그 소리 경고 '자체가' '[슈퍼 또는 자체] 초기화 ...]'의 결과로 설정되지 않은 상태에서 인스턴스 변수가 함께 사용 "입니다 ATTR의 _buffer 속성의 역 참조가 강조되고

도움이된다면

이 경고는이 방법에서 호출 할 때 문제가 발견 언급하는 것 같다.

- (id)copyWithZone(NSZone *)zone { 
    return [(ZAttributedString *)[ZAttributedString allocWithZone:zone] initWithAttributedString:self]; 
} 

수 아무에게도 결함이 정확히 무엇인지 설명해 주시겠습니까?

TIA!

답변

4

인스턴스 변수에 액세스 할 때 ->을 사용하지 마십시오. 특히은 다른 객체에서 가져온 것입니다.

는이 작업을 수행 :

_buffer = [[attr string] mutableCopy]; 

같은 그 불쾌한 attr->_attributes 간다. 분명히, ZAttributedString exposes 속성`개인 헤더의 속성으로.


컴파일러 경고는 매우 낙관적 인 것으로서, 완전히 오해의 소지가 있으며, 설명에서 상당히 틀린 것 같습니다. 버그를 공개하면 명확 해집니다. 이 복사 생성자와 같은 역할로 ->를 사용하여 전달 된 attr 문자열에 직접 인스턴스 변수에 액세스하는 것을 @ 매디의 주장이 잘못되었다고


참고.

들어오는 attr 정말로 ZAttributedString 인스턴스 또는 서브 클래스의 인스턴스 또는, ZAttributedString와 같은 인터페이스를 구현하는 클래스의 인스턴스 일 수있다. 따라서 실제로는 이 올바른 상태를 차지하도록 보장하기 위해 접근자를 통과해야합니다.

지금, 구현 세부로, ZAttributedString는 인바운드 인스턴스가 ZAttributedString의 비 - 서브 클래스 인스턴스가 필요하지만, 그 요구 사항을 주장 isMemberOfClass:를 사용한다 (그리고, 그렇게하지 마십시오).

다른 개체에서 상태를 끌어 오기 위해 직접 ivar 액세스가 사용되는 유일한 위치는 copyWithZone:의 구현에 있지만 매우 깨지기 쉽고 깨진 동작이 발생하지 않습니다. 실제로 copyWithZone: (다양한 plist 호환 값 클래스에서 제외됨)은 취약성과 많은 버그가 많이 발생했습니다.

+3

사실,이 코드는'ZAttributedString' 클래스에서 가져온 것이므로 같은 클래스의 다른 인스턴스에서 ivars에 액세스하려면'-> '를 사용하는 것이 딱 맞습니다. 기본적으로 "복사 생성자"를 만들 때 이러한 코드에 적합합니다. – rmaddy

+1

이 경우에도 실제로는 정확하지 않습니다. * 그것이'-copy' 메소드 자체라면 * 아마도 * (ObjC의 역사에서 정말 거친 부분이라 할지라도 - NSCopyObject()는 고통을 끝내지 않았다). 하지만 DI에는 없습니다. 클래스는 게이 터에 무언가를하는 논리를 가질 수 있으며 인바운드 인스턴스는 동작을 알 수없는 하위 클래스 일 가능성이 큽니다. – bbum

+0

@bbum : "들어오는 attr은 ZAttributedString 인스턴스 또는 하위 클래스의 인스턴스 일 수 있습니다."self "는 하위 클래스의 인스턴스 일 수도 있으므로이 인수로 인스턴스 변수에 액세스 할 수 없으며 이는 사실이 아닙니다. – user102008

2

정확히 같은 버그가있는 것 같습니다 : "[Bug 15092] New: static analyzer false positive: reports instance variable used while 'self' is not set to the result of [(super or self)] init". 버그를 재현하기 위해 아주 비슷한 코드가 첨부되어 있습니다.

Xcode 4.6.3에서 해당 코드를 실행하면보고있는 것과 동일한 경고가 발생하는지 확인할 수 있습니다.

버그

enter image description herecomment로 해결되었습니다 :

이 트렁크에 고정, 또는 적어도 대부분 고정이 - 경고가 발광 경우 여전히 몇 가장자리가있다, 그러나 당신의 프로젝트는 아닙니다.

(데이브, 주요 분석기 엔지니어 모두 지금 애플에서 일하고 않기 때문에 중복을 제기 할 진짜 필요 없습니다. 애플에서 작동하지 않는 LLVM 사람들이 애플 연타에 액세스 할 수 없습니다 수행 엑스 코드, 그리고이 수정되는 선박 엑스 코드 4.6을하지 않았다. 당신이 버그가 엑스 코드 4.6에서 해결하지만 여전히 존재 볼 수 있듯이 당신도) 새로운 검사기가 http://clang-analyzer.llvm.org에서 빌드

를 얻을 수 있습니다. Xcode의 다음 버전을 기다리고 분석기 경고가 없어야합니다.

+0

llvm 버그를 추적 해 주셔서 감사합니다. 유능한! – bbum