How is access for private variables implemented in C++ under the hood?이 질문에 대한 답변을 얻었습니다. 개인 데이터 멤버에 액세스하는 대신 캐스팅과 레이아웃 호환성에 의존하여 private 멤버 함수를 호출 할 수 있습니까? 이 (적어도 Ideone에) 작동 :레이아웃 호환 유형으로 캐스팅하여 개인 멤버 함수에 액세스 할 수 있습니까?
#include <iostream>
class X
{
public:
X() : private_(1) { /*...*/ }
private:
int Value() { return private_; }
int private_;
};
// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
// hopefully has the same data layout as X
{ // so we can pass him off as one
public:
int Value() { return private_; }
private:
int private_;
};
int f(X& x)
{
// evil laughter here
return (reinterpret_cast<BaitAndSwitch&>(x)).Value();
}
int main()
{
X x;
std::cout << f(x) << "\n"; // prints 0, not 1
return 0;
};
주 (허브 셔터의 열 Uses and Abuses of Access Rights에서 영감을)
일부 코드! 새로운 C++11 Standard이 또는 적어도 구현 정의 -으로 정의 된 방식으로 레이아웃 호환성 및 reinterpret_cast/static_cast를 사용하여 액세스 제어를 우회하는 방법이 있습니까?
EDIT1 : (이 실제로 작동하지만) 그는 위의 코드가 작동하지 않을 이유 두 가지 이유를 나열 셔터의 열에서
A) : Ideone
EDIT2에 출력 X와 BaitAndSwitch의 오브젝트 레이아웃은 같은 것이 보장되지는 않지만 실제로는 항상 그렇습니다.
b) 대부분의 컴파일러는 해커가 의도 한대로 의 결과 참조를 사용하도록 허용하지만 reinterpret_cast의 결과는 정의되지 않습니다.
새로운 C++ 11 Standard는 이제 이러한 레이아웃/reinterpret_cast 보장을 제공합니까?
'reinterpret_cast'를 사용하여 원하는 모든 것을 우회 할 수 있습니다. 잘 정의 된 방식으로 그렇게 할 수 있는지 묻고 있습니까? –
@OliCharlesworth 예, 보장은 최상의 것이고, 구현은 두 번째로 우수하며 UB는 좋지 않습니다. – TemplateRex
안돼. 어셈블리 수준의 클래스 메서드는 숨겨진 "this"매개 변수가있는 전역 함수이며 클래스 인스턴스에 속하지 않으며 레이아웃 트릭을 통해 액세스 할 수 없습니다. –