Ponteiro varrendo - Pointer swizzling
Em ciência da computação , swizzling de ponteiro é a conversão de referências baseadas no nome ou posição em referências diretas de ponteiro ( endereços de memória ). Normalmente é executado durante a desserialização ou carregamento de um objeto relocável de um arquivo de disco, como um arquivo executável ou estrutura de dados baseada em ponteiro .
A operação reversa, substituindo ponteiros de memória por símbolos ou posições independentes de posição, às vezes é chamada de unswizzling e é executada durante a serialização (salvamento).
Exemplo
É fácil criar uma estrutura de dados de lista vinculada usando elementos como este:
struct node {
int data;
struct node *next;
};
Mas salvar a lista em um arquivo e recarregá-la (na maioria dos sistemas operacionais) quebrará todos os links e tornará a lista inútil porque os nós quase nunca serão carregados nos mesmos locais de memória. Uma maneira de salvar e recuperar a lista de maneira útil é atribuir um número de id exclusivo a cada nó e, em seguida, desfazer os ponteiros transformando-os em um campo que indica o número de id do próximo nó:
struct node_saved {
int data;
int id_number;
int id_number_of_next_node;
};
Registros como esses podem ser salvos em um arquivo em qualquer ordem e recarregados sem quebrar a lista. Outras opções incluem salvar o deslocamento do arquivo do próximo nó ou um número indicando sua posição na sequência de registros salvos.
Depois de carregar essa lista, encontrar um nó com base em seu número é complicado e ineficiente (pesquisa em série). Percorrer a lista foi muito rápido com os ponteiros "próximos" originais. Para converter a lista de volta à sua forma original, ou swizzle os ponteiros, requer encontrar o endereço de cada nó e transformar os campos id_number_of_next_node de volta em ponteiros diretos para o nó correto.
Métodos de unswizzling
Há um número potencialmente ilimitado de formas nas quais um ponteiro pode ser desativado, mas algumas das mais populares incluem:
- O deslocamento do objeto apontado no arquivo
- O índice do objeto apontado em alguma sequência de registros
- Um identificador exclusivo possuído pelo objeto apontado, como o número do Seguro Social de uma pessoa ; em bancos de dados, todos os ponteiros não são alternados desta maneira (consulte Chave estrangeira ).
Métodos de swizzling
Swizzling no caso geral pode ser complicado. O gráfico de referência de ponteiros pode conter um número arbitrário de ciclos ; isso complica a manutenção de um mapeamento dos antigos valores não swizzled para os novos endereços. Arrays associativos são úteis para manter o mapeamento, enquanto algoritmos como pesquisa em largura ajudam a percorrer o gráfico, embora ambos exijam armazenamento extra. Várias bibliotecas de serialização fornecem sistemas gerais de swizzling. Em muitos casos, no entanto, o swizzling pode ser executado com suposições simplificadas, como uma estrutura de árvore ou lista de referências.
Os diferentes tipos de swizzling são:
- Swizzling automático
- Swizzling sob demanda
Potenciais pontos fracos de segurança
Por segurança, unswizzling e swizzling devem ser implementados com muito cuidado. Em particular, a apresentação de um arquivo especialmente criado por um invasor pode permitir o acesso a endereços fora dos limites esperados e adequados. Em sistemas com proteção de memória fraca, isso pode levar à exposição de dados confidenciais ou modificação do código que provavelmente será executado. Se o sistema não implementar proteções contra a execução de dados, o sistema pode ser seriamente comprometido pela instalação de vários tipos de malware .
Os métodos de proteção incluem verificações antes de liberar os dados para um aplicativo:
- Cada deslocamento está dentro dos limites dos dados lidos.
- Que uma tabela de índices e os registros apontados sejam igualmente restritos.
- Esses identificadores são únicos e, se confidenciais, criptografados.
- Todos os dados de comprimento variável são restritos a comprimentos que não excedem a alocação real.
- Essas alocações são de tamanho razoável.
- Essas alocações feitas que não são carregadas com dados lidos são apagadas ou carregadas com algum padrão específico.
Referências
- Paul R. Wilson : Ponteiro oscilando no tempo de falha de página: suportando com eficiência grandes espaços de endereço em hardware padrão , ACM SIGARCH Computer Architecture News , Volume 19, Edição 4, pp. Junho de 1991.
- Alfons Kemper e Donald Kossmann : Adaptable Pointer Swizzling Strategies in Object Bases: Design, Realization, and Quantitative Analysis (2,56 MB), The International Journal on Very Large Data Bases , Volume 4, Issue 3, pp. 519-567. Julho de 1995.
- Derek Crawford : 'Derek's ABC of C', Volume 2, pp 340-343. Junho de 1992.
links externos
- Este artigo é baseado em material retirado do Swizzle no Free On-line Dictionary of Computing anterior a 1 de novembro de 2008 e incorporado sob os termos de "relicenciamento" do GFDL , versão 1.3 ou posterior.