Nice programing

코드가 널 포인터를 통해 명시 적으로 정적 메서드를 호출하는 이유는 무엇입니까?

nicepro 2020. 12. 25. 22:58
반응형

코드가 널 포인터를 통해 명시 적으로 정적 메서드를 호출하는 이유는 무엇입니까?


몇 가지 오래된 프로젝트에서 다음과 같은 코드를 보았습니다.

class Class {
    static void Method() {}
};

((Class*)0)->Method();

이 코드에는 이후에 어떤 일이 발생하더라도 널 포인터 역 참조가 포함되므로 정의되지 않은 동작이 포함됩니다. 정말 의미가 없습니다-캐스트는 컴파일러에 유형 이름을 제공하기 위해 거기에 있으며 위 코드를 작성한 사람은 대신 이것을 작성할 수 있습니다.

Class::Method();

후자는 괜찮을 것입니다.

왜 누군가 이전 코드를 작성하겠습니까? 좋은 옛날부터 알려진 관용구입니까?


정적 멤버 함수는 1989 년 AT & T C ++ 언어 시스템 (사전 표준화) 릴리스 2.0 에서 C ++에 추가되었습니다 . 그 전에는 static키워드를 사용하여 정적 멤버 함수를 선언 할 수 없었기 때문에 코드 작성자는 주로 널 포인터를 간접적으로 관찰 한 방법 인 해결 방법을 사용했습니다.

에서 선정 된 독서 섹션 1-22에서 AT & T C ++ 언어 시스템의 버전 2.0을 동반, 스트로브 스트 룹의 글 :

다음과 같은 이식 불가능한 코드도 관찰되었습니다.

((X*)0)->f();

정적 멤버 함수를 시뮬레이션하는 데 사용되었습니다. 이 트릭은 조만간 누군가가 f()이런 식으로 사용 virtual되는를 만들고 X주소 0에 객체 가 없기 때문에 호출이 끔찍하게 실패 하기 때문에 시한 폭탄 입니다. f()가상이 아닌 곳에서도 이러한 호출은 일부 동적 연결 구현에서 실패합니다.

귀하의 코드는 Cfront 1.0에서 컴파일하도록 작성되었거나 정적 멤버 함수를 언어에 추가 할 때 인식하지 못한 사람이 작성했습니다.

멤버 함수의 주석은 Cheers와 hthstatic 처럼 실제로 퍼즐 입니다. -Alf 가 관찰했습니다. Cfront 1.0은 다음과 같이 해당 코드를 거부했을 것입니다.

error:  member Method() cannot be static

그래서 처음에는 거기에있을 수 없었습니다. 나는 Potatoswatter 가 가장 정확 하다고 생각 합니다. static나중에 MethodC ++ 2.0 컴파일러의 사용이 보장 될 수 있지만 호출 코드가 업데이트되지 않으면의 정적 메서드 속성을 문서화하고 적용하기 위해 나중에 추가 되었습니다. 이를 확인하려면 원래 프로그래머와 인터뷰하거나 최소한 소스 제어 기록 (존재하는 경우)을 조사해야합니다.

참조 URL : https://stackoverflow.com/questions/25719244/why-would-code-explicitly-call-a-static-method-via-a-null-pointer

반응형