짧고 달콤한 : 다음 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
이 사용되고 있음을 경고하지 않습니다 (두 코드 스 니펫에서).
일에서 javac 컴파일러는에 오류 것, 그 예 (JVM의 스택 기반 바이트 코드와 자바 사양 만들 것 비록 내가 거기 정의되지 않은 동작을 수 있도록 해주는 컴파일러를 만들/찾을 수있어 가정 그것은 매우 희박합니다 - 버그는 말할 것도없이 ;-). –
예, 저는 Sun의 컴파일러를 사용하여 이것이 허용되지 않았을 것이라고 확신했습니다. LLVM GCC 4.2에서 오류가 아니라는 것이 이상하다는 것을 알았습니다. 특히 로컬 변수라고 생각하면됩니다. –