2010-07-28 5 views
2
쓰레기 또는 정의되지 않은 논리 오류입니다

나는 iOs4 우리의 아이폰 앱을 업데이트하고 있는데 코드할당 된 값이 엑스 코드

for (i = 0; i < self.numberOfSegments; i++) { 
     [self setWidth:round(width[i]) forSegmentAtIndex:i]; 
} 

에 문제 "패스에 의해 인수 함수 호출이 정의되지"로 실행 한 충분하다. width [i]가 초기화되지 않았다. 그러나 아래 코드를 업데이트하면 "할당 된 값은 가비지 또는 정의되지 않음"이라는 새로운 오류가 나옵니다. 이 글에서 segWidth는 가비지로서의 가치를 유지한다고 생각합니다. 정확하고 그렇다면 어떻게해야합니까?

for (i = 0; i < self.numberOfSegments; i++) { 
    float segWidth = (float)width[i]; 
    [self setWidth:round(segWidth) forSegmentAtIndex:i]; 
} 

------------- 편집 ------------------ 답장들에 대한

감사합니다. 더 자세한 정보는 다음과 같습니다.

메소드의 일반화 된 버전은 someFunction으로 아래에 표시됩니다. 나는 못생긴 캐스트를 제거했지만 라인에 대해 "할당 된 값은 가비지 또는 정의되지 않음"논리 오류가 표시됩니다. segWidth = width[i];

값 폭 [i]가 명확한 초기화를 가지고 있지 않은 것으로 알고 동의합니다. 기본 Obj-c 부동 유형에 대한 이해가 부족하거나 할당 구문에 논리 결함이있는 경우? setWidth의

- (void)someFunction 
{ 
    unsigned int n = self.numberOfSegments; 
    float width[n]; 

    for (i = 0; i < n; i++) { 
     width[i] = someFloatValue; 
    } 

    ...  

    for (i = 0; i < self.numberOfSegments; i++) { 
     float segWidth = 0.0; 
     segWidth = width[i]; 

     [self setWidth:round(segWidth) forSegmentAtIndex:i]; 
    } 

} 

정의는 다음과 같습니다

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment 

을 그리고 패스에 의해 인수 함수 호출에을 정의되지 않는다 즉 : 당신이 요구하고 있으리라 믿고있어

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;   // set to 0.0 width to autosize. default is 0.0 
+2

'setWidth : forSegmentAtIndex :'에 대한 전체 메소드 서명은 무엇입니까? 우리는 그러한 유형을 볼 필요가 있습니다. –

+2

당신이 너비를 캐스팅한다는 사실은 나를 깜짝 놀라게한다. –

+0

오른쪽 - ObC/코코아의 두 번째 주입니다. 내 코드베이스가 아닙니다. 메소드 서명은 - (void) setWidth : (CGFloat) width forSegmentAtIndex : (NSUInteger) segment; 캐스팅은 알려지지 않은, 불명확 한 해킹에 대한 더 많은 정의를 얻으려는 시도였습니다. 헤드 업에 감사드립니다! – lucygenik

답변

5

실제로 LLVM 정적 분석기는 빌드 및 분석을 수행 할 때 오류가 발생합니다. 두 가지 중요한 데이터 요소가 있습니다. 정확히 무엇을하고 있었는지 정확히 출력물이 무엇인지 알려주는 것이 좋습니다.

그리고 width[i]은 초기화되지 않았다고합니다.

float segWidth = (float)width[i]을 추가하면 해당 분석기가 ** 할당 된 값이 불필요하거나 정의되지 않음 **으로 불만을 제기해야합니다. 실제로 width[i]을 설정하지 않았습니다. 그 첫 번째 오류 메시지는 정말 철저히 둔하기 때문에 정적 분석기에 대한 버그를 제기하는 것이 좋습니다 것이 좋습니다.

조슈아 (Joshua)도 말했듯이, 그 주연은 정말 이상합니다. 일반적으로 Objective-C에서는 타입 캐스팅을 거의 사용하지 않아야하며 스칼라 유형에는 거의 사용하지 않아야합니다.


은 두 루프의 수를 고려하십시오

for (i = 0; i < n; i++) { 
... 
} 


for (i = 0; i < self.numberOfSegments; i++) { 
... 
} 

가 정적 분석기는 n == self.numberOfSegments는, 따라서, 가정해야한다는 것을 모르는 두 번째 루프는 루프 이상 처음보다 수 있었다. 이제 "n = self.numberOfSegments 위를 지정 했습니까?"라고 말할 수 있습니다.

그랬지만 첫 번째 호출과 두 번째 호출 사이에이 값이 변경되어 분석기가 초기화되지 않은 값을 사용하고 있음을 올바르게 확인했습니다.

(실제로 위험 할 수 있으므로 배열 끝에서 벗어날 수도 있음을 의미합니다.)

+0

감사합니다. 저는 최근 10 년 동안 스크립팅 언어에서 큰 소년들과 합류하여 기초적인 설명을 사과해야합니다. 더 자세한 정보로 질문을 편집했는데,이 논리 결함을 해결하는 방법에 대해서는 아직 확실하지 않습니다. – lucygenik

+0

Ahhh, bbum - 당신은 챔피언입니다. 시간을내어 대답 해 주셔서 감사합니다. 완벽하게 이해할 수 있습니다 (문제가 해결되었습니다). :) – lucygenik