dereferencing null 포인터가 정의되지 않았 음을 알고 있습니다. 그러나 특정 대상 (MSP430)에서 어떤 일이 발생하는지 알고 싶습니다.MSP430에서 널 포인터를 역 참조 할 때 어떻게됩니까?
나는 이것을 시험하기 위해 나 앞에서 이것을로드 할 보드가 없다.
내가이 작업을 수행하면 어떻게 될까요?
int * foo = NULL;
(*foo)++; //Crash?
위치 0x0는 SFR 범위에 있으며 예약되어 있습니다.
PUC/POR을 생성합니까? 아니면 조용히 "일"하겠습니까?
생성 된 어셈블리입니다
;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15
내가 0x0 주소의 값이 0에서 1 I 보러 시뮬레이터에서이 프로그램을 실행할 때 그래서 위치 0x0을 그대로 1.
에 의해 증가되는
디버그 로그에 경고가 나타나지 않고 프로그램이 정상적으로 종료됩니다.
IAR EW430 컴파일러/어셈블러/시뮬레이터를 사용하고 있습니다.
너무 명확하므로 정의되지 않은 동작에 대해 관찰 된 동작을 요구합니다. 큰 명령. 이 질문은 당신이 당신의 미트에 실제 하드웨어를 가지고 있다면 여기에 없을 것입니다, 맞습니까? 그리고 심지어 그렇다하더라도, 위반의 시점에 최우선의 인터럽트 훅이 설치되었는지 여부에 의존하지 않을 것인가? 그것은 동일한 순간의 특정 순간에 달려 있는가? (또는 위의 모든 것을 완벽하게 제어 할 수 있습니까?). – WhozCraig
@WhozCraig 맞습니다. 너트 셸에서 msp430이 0x0이 읽혀 지거나 쓰여지거나 또는 계속 악의적으로 작동 할 때 msp430이 강력하게 종료되는지를 묻습니다. 나는 그 주소가 어쨌든 포함 할 것이 무엇인지 알아낼 수없는 것 같습니다. 정상적인 범위를 벗어난 "비어있는"메모리에 액세스 할 때 발생할 수있는 인터럽트가 있습니다.이 이벤트에서 이벤트에 대한 일부 로깅을 수행 할 수 있지만 여기서는 옵션으로 생각하지 않습니다. 더 많거나 적습니다. 인터페이스에서 포인터 매개 변수를 확인하거나 그렇지 않으면 어설 션을 사용하지 않는 커다란 통제력이없는 레거시 코드베이스에 대해 묻습니다. – Nick
어드레스 0,1은 인터럽트 인 에이블 비트이다. 따라서 주소 0을 값 0에서 값 1로 증가 시키면 인터럽트 중 하나가 활성화됩니다. 프로그램은 계속 실행됩니다. @ 닉, msp430 아키텍처 시트를 읽지 않으셨습니까? 아키텍처 사양은 다음에서 찾을 수 있습니다. –
user3629249