Pode-se acessar as funções de membros privados através de conversão para tipos compatíveis com layout?
Da discussão desta questãoComo o acesso para variáveis privadas é implementado em C ++ sob o capô? Eu postei uma variação: em vez de acessar um membro de dados privados, pode-se chamar funções de membros privados através de conversão e confiando na compatibilidade de layout?
Algum código (inspirado na coluna de Herb SutterUsos e abusos de direitos de acesso )
#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;
};
Nota: isso funciona (pelo menos no Ideone)! Existe alguma maneira do novoC ++ 11 Standard dá umgarantido ou pelo menos umimplementação definida maneira de contornar o controle de acesso, baseando-se em compatibilidade de layout e reinterpret_cast / static_cast?
EDIT1: saída emIdeone
EDIT2: Na coluna de Sutter, ele lista duas razões pelas quais o código acima não tem garantia de funcionar (embora funcione na prática)
a) Os layouts de objetos de X e BaitAndSwitch não têm garantia de serem os mesmos, embora, na prática, provavelmente sempre sejam.
b) Os resultados do reinterpret_cast são indefinidos, embora a maioria dos compiladores permita que você tente usar a referência resultante da maneira que o hacker pretendia.
O novo C ++ 11 Standard agora fornece estas garantias layout / reinterpret_cast?