Pointeur oscillant - Pointer swizzling

En informatique , le swizzling de pointeur est la conversion de références basées sur le nom ou la position en références directes de pointeur ( adresses mémoire ). Elle est généralement effectuée pendant la désérialisation ou le chargement d'un objet réadressable à partir d'un fichier disque, tel qu'un fichier exécutable ou une structure de données basée sur un pointeur .

L'opération inverse, remplaçant les pointeurs de mémoire par des symboles ou des positions indépendants de la position, est parfois appelée non- oscillation et est effectuée pendant la sérialisation (sauvegarde).

Exemple

Il est facile de créer une structure de données de liste chaînée en utilisant des éléments comme celui-ci:

struct node {
        int data;
        struct node *next;
};

Mais enregistrer la liste dans un fichier, puis la recharger (sur la plupart des systèmes d'exploitation) rompra chaque lien et rendra la liste inutile car les nœuds ne seront presque jamais chargés dans les mêmes emplacements de mémoire. Une façon utile de sauvegarder et de récupérer la liste est d'attribuer un numéro d'identification unique à chaque nœud, puis de débloquer les pointeurs en les transformant en un champ indiquant le numéro d'identification du nœud suivant:

struct node_saved {
        int data;
        int id_number;
        int id_number_of_next_node;
};

Les enregistrements comme ceux-ci peuvent être enregistrés dans un fichier dans n'importe quel ordre et rechargés sans casser la liste. D'autres options incluent l'enregistrement du décalage de fichier du nœud suivant ou un nombre indiquant sa position dans la séquence des enregistrements enregistrés.

Après avoir chargé une telle liste, trouver un nœud en fonction de son numéro est fastidieux et inefficace (recherche en série). Traverser la liste était très rapide avec les pointeurs originaux "suivant". Pour reconvertir la liste à sa forme d'origine, ou faire basculer les pointeurs, il faut trouver l'adresse de chaque nœud et transformer les champs id_number_of_next_node en pointeurs directs vers le nœud droit.

Méthodes de relâchement

Il existe un nombre potentiellement illimité de formes dans lesquelles un pointeur peut être libéré, mais certaines des plus populaires incluent:

  • Le décalage de l'objet pointé dans le fichier
  • L'index de l'objet pointé dans une séquence d'enregistrements
  • Un identifiant unique possédé par l'objet pointé, tel que le numéro de sécurité sociale d' une personne ; dans les bases de données, tous les pointeurs sont déverrouillés de cette manière (voir Clé étrangère ).

Méthodes de swizzling

Swizzling dans le cas général peut être compliqué. Le graphe de référence des pointeurs peut contenir un nombre arbitraire de cycles ; cela complique le maintien d'un mappage entre les anciennes valeurs non inversées et les nouvelles adresses. Les tableaux associatifs sont utiles pour maintenir le mappage, tandis que des algorithmes tels que la recherche en largeur d'abord aident à parcourir le graphique, bien que les deux nécessitent un stockage supplémentaire. Diverses bibliothèques de sérialisation fournissent des systèmes de swizzling généraux. Dans de nombreux cas, cependant, le swizzling peut être effectué avec des hypothèses simplificatrices, telles qu'une arborescence ou une liste de références.

Les différents types de swizzling sont:

  • Swizzling automatique
  • Swizzling à la demande

Faiblesses potentielles de sécurité

Pour des raisons de sécurité, le non-balancement et le swizzling doivent être mis en œuvre avec une grande prudence. En particulier, la présentation par un attaquant d'un fichier spécialement conçu peut permettre d'accéder à des adresses en dehors des limites attendues et appropriées. Dans les systèmes à faible protection de la mémoire, cela peut conduire à une exposition de données confidentielles ou à une modification du code susceptible d'être exécuté. Si le système n'implémente pas de protections contre l'exécution des données, le système peut être gravement compromis par l'installation de divers types de logiciels malveillants .

Les méthodes de protection comprennent des vérifications avant de divulguer les données à une application:

  • Que chaque décalage se situe dans les limites des données lues.
  • Le fait qu'une table d'index et les enregistrements pointés verse soit soumis à des contraintes de la même manière.
  • Ces identifiants sont uniques et, s'ils sont sensibles, chiffrés.
  • Que toutes les données de longueur variable sont limitées à des longueurs ne dépassant pas l'allocation réelle.
  • Ces allocations sont de taille raisonnable.
  • Les allocations effectuées qui ne sont pas chargées avec les données lues sont effacées ou chargées avec un modèle spécifique.

Les références

Liens externes