2009-05-19 8 views
2

에 나는이 코드 줄이없는이 (분할 인스턴스 변수입니다) :장치에 오류가 있지만 시뮬레이터

splits = [[NSMutableArray alloc] initWithObjects:[NSMutableArray array]]; 

이 코드는 (종료 전무 -이 있어야합니다) 분명히 잘못된 것입니다, 그러나 그것은에서 잘 실행 시뮬레이터는 장치에 EXC_BAD_ACCESS을 던진 경우에도 마찬가지입니다. 내 질문은 왜 시뮬레이터가 오류를 던지지 않는가?

카일

답변

4

실제 결과는 메모리 내용에 따라 다릅니다. 시뮬레이터의 메모리 레이아웃에는 첫 번째 매개 변수 (익명 배열)의 주소 바로 뒤에 0이 포함되어있을 가능성이 큽니다. 이 0은 nil으로 인수리스트를 닫는 것처럼 해석되며 모든 것이 잘 동작합니다. (추신 : 여기에 분명히 도움이되지는 않지만 그러한 경우에는 NS_REQUIRES_NIL_TERMINATION이라는 재미있는 매크로가 있습니다.)

0

버퍼 오버 플로우로 인해 정의되지 않은 동작이 발생합니다. 액세스 위반 (또는 눈에 띄는 버그)이 발생할 수 있습니다. 현대의 컴퓨터에서는 "다른 사람의"메모리를 밟아도 액세스 위반이 발생하지만, 스택에서 정크 메일을 읽는 경우에는 액세스 위반이 발생할 수 있습니다.

기본적으로 조심해야하며 MudflapValgrind과 같은 도구를 사용해 볼 수 있습니다 (이 두 가지는 C/C++에서 더 의미가 있으며, Obj- 기음).

+0

이것은 오버플로가 정확히 같지 않습니다. 인수를 가져 오는 va_arg 매크로는 덮어 쓰지 않고 마지막 인수를 지나치기 만합니다. 아무것도. – zoul

+0

나는 여전히 버퍼 오버 플로우라고 생각할 것이다. 그것은 단지 a/read /가 버퍼의 끝을 오버플로하는 것이지/write /를 쓰는 것이 아닙니다. 기술적 인면은 CWE-126, 버퍼 오버 읽기 (cwe.mitre.org/data/definitions/126.html) 또는 CWE-125, 범위 외 읽기 (http : //cwe.mitre)입니다. .org/data/definitions/125.html). –

1

iPhone의 메모리 용량은 컴퓨터보다 훨씬 적습니다. 스택의 메모리 영역은 initWithObjects 함수에 의해 사용되기 전에 0x00 (nil)으로 설정 될 수 있습니다. 매개 변수가 initWithObjects 함수로 전송되고 스택이 채워지면 동일한 메모리 공간이 덜 자주 사용되기 때문에 컴퓨터의 해당 메모리 공간이 iPhone보다 0x00으로 사전 설정 될 가능성이 큽니다. 따라서 메모리에있는 0 자리가 이미 0으로 설정되어있을 가능성이 높습니다.

컴퓨터에서 메모리를 모두 채운 다음 시뮬레이터를 실행하면 시뮬레이터가 iPhone과 유사하게 작동하지 않을 수 있습니다.

+0

컴퓨터가 시뮬레이터와 같은 프로세스로 메모리를 통과시키기 전에 사용 된 메모리를 청소합니다 ... 프로세스가 O/S로부터 메모리를 요청하면 O/S가 메모리를 청소하기 전에 메모리를 청소하지 않습니다. 프로세스를 요청하면 보안/개인 정보 위험이됩니다. – ChrisW

관련 문제