>  기사  >  백엔드 개발  >  잘못된 포인터 주소를 저장하면 정의되지 않은 동작이 발생합니까?

잘못된 포인터 주소를 저장하면 정의되지 않은 동작이 발생합니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-26 10:08:03362검색

Is Storing an Invalid Pointer Address Undefined Behavior?

잘못된 포인터 저장

잘못된 포인터를 역참조하면 정의되지 않은 동작이 발생한다는 것은 잘 알려져 있지만 덜 명확한 질문이 발생합니다. 포인터 변수 자체에 잘못된 메모리 주소를 저장하는 행위는 정의되지 않은 동작인가요?

다음 코드 조각을 고려하세요.

<code class="c++">const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }</code>

이 예에서 표현식 begin - 1은 잘못된 메모리 주소입니다. 그러나 주소는 명시적으로 역참조되지 않고 유효성을 확인하기 위해 포인터 연산에 사용됩니다.

이 시나리오는 정의되지 않은 동작으로 간주됩니까?

직관적으로 일부에서는 다음과 같이 주장할 수 있습니다. 포인터 산술은 종종 그러한 연산에 달려 있기 때문에 그렇지 않습니다. 또한 포인터는 본질적으로 정수입니다. 그러나 유효하지 않은 포인터를 레지스터에 저장하는 단순한 행위조차도 잠재적인 구조적 영향(예: 버스 오류)으로 인해 정의되지 않은 동작이 될 수 있다고 주장되어 왔습니다.

이 문제를 명확히 하기 위해 관련 C 또는 C 표준. 불행하게도 이 문제는 누락으로 인해 해결되지 않은 채 남아 있습니다. C Draft Standard의 섹션 6.5.6/8에서는 포인터가 배열 요소를 가리키고 배열이 충분히 크거나 피연산자가 마지막 배열 요소 하나를 지나갈 때 포인터 연산의 의미를 설명합니다. 위에서 설명한 상황에서의 동작은 이러한 특정 사례에 속하지 않습니다. 따라서 잘못된 포인터를 저장하는 것은 정의되지 않은 동작을 생략하는 것입니다.

위 내용은 잘못된 포인터 주소를 저장하면 정의되지 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.