2011-03-20 6 views
1

짧고 달콤한 : 다음 Objective-C 코드 블록이 컴파일러 오류/경고를 생성하지 않는 이유는 무엇입니까? 할당 할 때 't'가 실제로 잘못된 메모리 주소를 가리키는으로정의 된 동일한 문장에서 변수를 사용합니까?

- (void)someMethod:(MyObject *)someArg { 
    MyObject *t = [self otherMethod:t.property]; // Typo. 't.property' should be 'someArg.property' 
    [t doSomething]; 
} 

나는, 런타임 동작을 이해합니다.

예 : (내 기억이 맞다 경우) 변수 t가 property 게터가 호출 될 때 유효한 값이없는 보장으로 일반적으로, 컴파일러 오류가 발생합니다 자바에서

MyObject *t; 
t = [self otherMethod:t.property]; 
[t doSomething]; 

이 : 위의 코드 라인은 논리적으로 동일합니다. (물론 은 가치가이지만, 가치가있는 것은 아닙니다.)

몇 분 전에이 문제가 발생하여 문제가 무엇인지 판단하는 데 더 오래 걸렸습니다. 컴파일러가 올바르게 초기화되기 전에 포인터 t이 사용되고 있음을 경고하지 않습니다 (두 코드 스 니펫에서).

+0

일에서 javac 컴파일러는에 오류 것, 그 예 (JVM의 스택 기반 바이트 코드와 자바 사양 만들 것 비록 내가 거기 정의되지 않은 동작을 수 있도록 해주는 컴파일러를 만들/찾을 수있어 가정 그것은 매우 희박합니다 - 버그는 말할 것도없이 ;-). –

+0

예, 저는 Sun의 컴파일러를 사용하여 이것이 허용되지 않았을 것이라고 확신했습니다. LLVM GCC 4.2에서 오류가 아니라는 것이 이상하다는 것을 알았습니다. 특히 로컬 변수라고 생각하면됩니다. –

답변

2

objective-c 컴파일러는 Java 컴파일러와 관련이 없기 때문에 Java 컴파일러와 동일한 방식으로 동일한 오류 케이스를 처리 할 이유가 없습니다.

필자는 컴파일러가 이와 같은 경우에 경고를 발생시키지 않았지만 포인터를 직접 조작 할 수있는 언어에서는이 케이스를 확실히 감지하기가 정말로 어렵다는 것에 동의합니다. 예를 들어 :

MyObject* t; 
MyObject** pointerToT = &t; 
*pointerToT = [[MyObject alloc] init]; 

//now I can use 't', even though I never assigned anything to it directly 
[t doSomething]; 
+0

예를 들어 주셔서 감사합니다. 컴파일러가 경고/오류를 표시하지 않는 이유가 여기에 있습니다. –

관련 문제