2012-08-23 4 views
1

나는 const 문자열 리터럴이 손상되었습니다. 이상한 무엇const 전역 문자열 리터럴이 손상됨

는 분명히 (내가 할 수 전에 100 % 확인이 몇 가지 더 실험을 할 수있어) 설치 엑스 코드의 버전에 따라 다르게 작동하고 있다는 것입니다,하지만 다음 Xcode를하지 않더라도 그 원인이 무엇인지 궁금하네요.

정확하게 동일한 코드가 동일한 핸드셋에서 실행되지만 하나의 실행 코드가 Xcode 3.3.3을 실행하는 랩톱에 연결된 경우 동일한 코드 및 동일한 핸드셋이 다른 랩톱에서 실행되는 경우이 문제가 나타납니다 XCode 4.3.2 또는 4.4가 설치된 경우 문제가 발생하지 않습니다.

쟁점이있다 : 글로벌 전율 손상된 디버깅 할 때 엑스 코드 4.3.3 노트북 접속

HeaderFile.h 
extern NSString* const kValue; 

HeaderFile.m 
NSString* const kValue = @"Some Value"; 

OtherFile.m 
#import "HeaderFile.h" 
... 
NSLog(@"Value is: %@", kValue); 

다음 값이 기록 또는 관찰 하였다.

어떻게 생각하나요?

const 리터럴로서 내 코드에 버그가있는 경우 그 코드를 쓸어 넘겨서는 안됩니다.

UPDATE

: 나는 즉시 didFinishLaunchingWithOptions 후 kValue의 값을 조사 :라고하고 이미 그 시점에서 손상되면, 그래서 내 코드는 scribable 경우에도, 그 위에 낙서하기 위해 더 기회가 없습니다.

+0

읽기 : http://stackoverflow.com/questions/4354423/explanation-of-constants – bryanmac

+0

일부 로더 기발로 인해 상수의 초기화 프로그램이 호출되지 않을 가능성이 있습니다 (또는 단순히 응용 프로그램의 HeaderFile.m). –

답변

1

const 리터럴로서 내 코드에 버그가있는 경우 그 내용을 쓸어 넘겨서는 안됩니다.

그건 완전히 사실이 아닙니다.

우선 const는 간단한 캐스트로 제거 할 수도 있습니다. 둘째, 장 액성 버그가있는 경우 변수를 저장하는 메모리에 쓸 수 있습니다 (예 : short의 주소를 사용하여이 변수를 long* 유형으로 캐스팅 한 다음 액세스하는 경우)). 셋째로 포인터 자체가 const로 선언되었지만 가리키는 데이터는 const가 아닙니다 (적어도 선언에 따라 다르지는 않음).

한편, 일반적으로 관찰하는 것은 불가능할 수도 있습니다. 종종 const로 선언 된 전역 변수는 런타임시에만 읽혀지는 메모리 영역에 저장됩니다. 그러나 모든 하드웨어가 이것을 허용하는 것은 아니며, 컴파일러에 대한 실질적인 요구 사항은 없습니다. 또한 문자열 리터럴은 일반적으로 const로 간주되기 때문에 사실 포인터가 const가 아닌 경우에도 const 영역에 저장할 수 있습니다.

나는 왜 그 행동을 관찰하고 컴파일러와 아이폰 하드웨어의 내부를 알지 못하기 때문에 버그 때문에 그 데이터를 수정할 수 없다는 말을 할 수 없다. 그러나 나는 언어 규칙에 따라 컴파일러 (및 하드웨어)가 모든 것을 수정 가능한 영역에 저장하는 것이 합법적이라는 것을 알고 있습니다. 그리고 그것이 그들이하는 일이면, 그렇습니다. 버그가 문제 일 수 있습니다.

+0

didFinishLaunchingWithOptions :가 호출되고 그 시점에서 이미 손상된 경우 kValue의 값을 검사 했으므로 코드가 스크럽 가능한 경우에도 스크래블 할 수는 없습니다.이 밑바닥에 도달하려고 노력할 수있는 아이디어가 있습니까? – Gruntcakes

+0

심지어 이전 버전보다 손상 되었습니까? 'main'이 들어갈 때 그것은 무엇입니까? –

+0

도 있습니다. 필자는 동일한 설정으로 다른 랩톱에서 이것을 재현 할 수 없으므로 본질적으로 코드에 오류가있는 것보다 Xcode 설치가 엉망이 될 것이라고 생각하는 경향이 있습니다. 그래서 제거하고 다시 설치하고 결과를 확인합니다. 답장을 보내 주셔서 감사합니다. – Gruntcakes

관련 문제