Brevet FR2828750A1 — publié le 20030221

La présente invention est orientée de façon générale vers un logiciel et de façon plus spécifique, vers le contrôle d'un programme au cours de l'exécution pour éviter une utilisation incorrecte d'un pointeur. Dans la programmation des ordinateurs, des pointeurs sont utilisés en tant que variables qui contiennent l'emplacement ou adresse de mémoire de données, plutôt que les données elles-mêmes. L'utilisation de pointeurs permet d'effectuer une allocation dynamique de la mémoire utilisée pour les données et procure une souplesse supplémentaire dans la gestion des données. Dans un grand nombre de langages informatiques, les pointeurs sur les informations sont des espaces mémoire créés de façon dynamique pour la variable allouée sur laquelle on pointe et le pointeur actif est retourné, plutôt que de retourner les données elles-mêmes. Un"pointeur nul"peut être créé en cas d'échec d'une allocation de mémoire, si une allocation de mémoire est invalide ou s'il n'y a pas de valeur sur laquelle pointée par le pointeur. Un"pointeur nul"est un pointeur spécial qui, littéralement, ne pointe sur rien. De façon plus générale, si les informations sont indisponibles, un pointeur nul, appelé parfois pointeur nil, est retourné. Un pointeur nul est littéralement un pointeur sur rien, ce qui implique que les données demandées n'existent pas. Le pointeur nul indique habituellement qu'une opération de recherche de données est parvenue à un résultat vide. Comme décrit, un pointeur nul est un pointeur spécial qui indique l'absence de données, plutôt que de pointer sur des données spécifiques. Typiquement, le pointeur nul ne peut pas être utilisé comme serait utilisé un pointeur habituel. En tentant d'utiliser un pointeur nul comme un pointeur normal, des résultats imprévisibles peuvent se produire dans le système informatique. Ces résultats imprévisibles peuvent comporter l'arrêt du système informatique, provoquant la non-réponse du système ou la production de résultats invalides ou erronés. Les programmeurs ayant une bonne pratique de la programmation incorporent souvent un code spécial pour contrôler les pointeurs nuls pour éviter l'apparition de ces conditions d'erreurs. Lorsque les programmes comportent un logiciel pour reconnaître et réagir de manière appropriée à une utilisation incorrecte d'un pointeur nul, la présence d'un pointeur nul n'influe pas défavorablement sur le fonctionnement du système. Toutefois, des problèmes apparaissent en présence de pointeurs nuls lorsque les programmateurs ne contrôlent pas la présence du pointeur nul et traitent le pointeur nul comme s'il s'agissait d'un pointeur normal. Dans l'art antérieur, il existe des environnements qui surveillent le fonctionnement des programmes informatiques. Par exemple, un programmeur peut prendre un programme C++ et l'exécuter dans un environnement Purify. Purify est un contrôleur de mémoire pendant l'exécution, disponible auprès de Rational Technology, conçu pour rechercher les pertes de mémoire et une utilisation invalide de la mémoire. L'une des fonctions de Purify est de s'assurer que des pointeurs nuls ne sont pas utilisés de manière non appropriée. En conséquence, Purify contrôle les pointeurs avant leur utilisation et si un programme tente d'utiliser un pointeur nul de manière non appropriée. Purify envoie un message au programmeur, indiquant la mauvaise utilisation du pointeur nul. Pour tirer avantage de ces garanties, le programmeur doit exécuter son programme dans l'environnement du programme de surveillance. Ceci nécessite typiquement des étapes supplémentaires et a pour conséquence une charge accrue dédiée au programme de surveillance. Aussi bien des cycles de mémoire que de CPU sont consommés par le programme Purify et l'environnement résultant. De façon similaire, une mauvaise utilisation d'autres pointeurs peut également produire des résultats imprévisibles, comportant l'arrêt du programme informatique, provoquant la non-réponse du système ou la production de résultats invalides ou erronés. Cette mauvaise utilisation peut comporter un mauvais alignement des pointeurs pour le type de données récupérées et d'autres problèmes d'utilisation incohérente des pointeurs. La présente invention comporte un système et un procédé créant une construction de"pointeur de sécurité"qui est utilisée, par exemple, par une fonction, un sous-programme ou une variable globale, pour fournir des informations ou des données à un sousprogramme appelant, l'initialisation d'un segment de code ou un autre objet devant utiliser un pointeur fourni par un autre objet. Le"pointeur de sécurité" encapsule un pointeur natif à l'intérieur d'un objet, fournissant un contrôle de pointeur automatique pour détecter et éviter ou minimiser une mauvaise utilisation d'un pointeur. Des exemples d'une telle mauvaise utilisation comportent une tentative d'utilisation d'un pointeur nul pour accéder à des données et l'utilisation d'un pointeur sur une valeur entière pour récupérer un nombre réel. L'invention comporte un procédé de mémorisation et de manipulation de pointeurs dans un langage de programmation, où le langage de programmation supporte un type de pointeur natif et des opérations sur un pointeur standard. Le procédé comporte la définition d'un type de pointeur de sécurité qui supporte les opérations de pointeur standard, effectue un contrôle de pointeur automatique supplémentaire et utilise le type de pointeur de sécurité. Avantageusement mais facultativement, le procédé présente au moins l'une des caractéristiques suivantes : - ledit contrôle de pointeur automatique comporte le contrôle d'un pointeur nul, - ledit contrôle de pointeur automatique comporte le contrôle d'un alignement de pointeur incorrect, le procédé comprend en outre une étape consistant à exécuter un traitement d'erreur, - ledit traitement d'erreur comporte au moins une action parmi la production d'un message d'erreur et l'arrêt de l'exécution du programme ; la production d'un message d'avertissement sans arrêter l'exécution du programme ; et l'appel d'un sous-programme de traitement d'erreur défini par l'utilisateur, - le procédé comprend en outre les étapes consistant à : appeler une fonction qui retourne comme valeur un objet dudit type de pointeur de sécurité ; et exécuter lesdites opérations de pointeur standard sur ledit objet, - le procédé comprend en outre les étapes consistant à : lire une variable globale dudit type de pointeur de sécurité ; et exécuter ladite opération de pointeur standard sur ledit objet. - le procédé comprend en outre les étapes consistant à : appeler une fonction qui retourne comme valeur un objet dudit type de pointeur de sécurité, ledit objet encapsulant un objet pointeur natif incorrect ; et exécuter un traitement d'erreur en réponse audit objet pointeur natif incorrect, - ledit objet pointeur natif incorrect est constitué d'un parmi un pointeur nul, un pointeur désaligné et une mauvaise utilisation dudit pointeur dans le contexte, - le procédé comprend en outre les étapes consistant à : lire une variable globale encapsulant un objet pointeur natif incorrect ; et exécuter un traitement d'erreur en réponse audit objet pointeur natif incorrect. Un autre mode de réalisation de la présente invention comporte une classe de pointeurs de sécurité supportant à la fois la mémorisation et la manipulation d'un pointeur dans un langage de programmation, où le langage de programmation supporte un type de pointeur natif et des opérations sur un pointeur standard. Dans ce mode de réalisation, le type de pointeur de sécurité supporte des opérations de pointeur standard et un contrôle de pointeur automatique. Un autre mode de réalisation de la présente invention comporte un produit de programme informatique enregistré sur un support lisible par un ordinateur pour réduire la probabilité de mauvaise utilisation des pointeurs, sur lequel au moins une application logicielle est en cours d'exécution. Dans ce mode de réalisation, le programme informatique comporte un moyen pour définir un type de pointeur de sécurité, supportant une opération de pointeur standard et effectuer un contrôle de pointeur automatique. la figure 1 est un organigramme d'un programme contrôlant un pointeur nul et, si le pointeur nul est présent, traitant de manière appropriée le pointeur nul ; la figure 2 est un code d'opérations illustrant un mode de réalisation de la présente invention ; et la figure 3 illustre un système informatique adapté pour utiliser la présente invention. Il existe en conséquence un besoin pour un procédé de test d'une utilisation incorrecte d'un pointeur, qui soit transparent pour l'utilisateur, n'ait pas pour conséquence l'augmentation des ressources requises pour exécuter le programme et permette une réaction élégante à la mauvaise utilisation lorsqu'elle est présente. Il existe un autre besoin pour que ce procédé soit virtuellement transparent au programmeur en termes de mémoire requise et de ressources système requises pour mettre en oeuvre le sous-programme de gestion de mauvaise utilisation. La présente invention peut s'appliquer à une large gamme de contrôles pour vérifier l'utilisation correcte d'un pointeur et initialiser un traitement quelconque approprié pour éviter une erreur fatale, l'exécution d'une opération invalide et/ou fournir une notification d'une erreur, un avertissement ou une autre condition. Ainsi, l'invention envisage le contrôle, à titre d'exemple, de pointeurs nuls, de pointeurs qui ne sont pas convenablement alignés pour le type de données à récupérer (c'est-à-dire, des pointeurs désalignés) et d'une autre utilisation de pointeur incohérente avec une opération particulière, un type de données, etc. L'invention envisage en outre une large gamme de traitements possibles si une mauvaise utilisation ou une mauvaise utilisation potentielle est détectée comportant, par exemple, la fin de l'exécution d'un programme et la production d'un message d'erreur, la fourniture d'un message d'avertissement sans achever l'exécution du programme, la fourniture d'un autre traitement et/ou de valeurs par défaut en réponse à l'identification d'un problème de pointeur sans arrêter le programme, etc. L'organigramme 100 de la figure 1 est un organigramme simplifié d'un procédé de contrôle de la mauvaise utilisation d'un pointeur nul ou d'un autre pointeur, et du traitement de ces conditions selon la présente invention. Pour la présente illustration, à l'étape 101, le pointeur disponible pour être utilisé est examiné pour déterminer si le pointeur est égal au pointeur nul ou nil. Comme détaillé précédemment, d'autres conditions de pointeur peuvent également être contrôlées, telles qu'un désalignement du pointeur par rapport au type de données associées au pointeur (par exemple, réel, entier, caractère, pointeur, etc. ). Un contrôle d'alignement peut comporter le contrôle du type de données ou d'objets sur lesquels on pointe et la vérification du fait que l'adresse est cohérente avec le type de données ou d'objets. Si le pointeur n'est pas égal à un pointeur nil ou nul, le pointeur est utilisé comme désiré par le programme de l'utilisateur à l'étape 102. Si toutefois le pointeur examiné à l'étape 101 est égal au pointeur nul, un message est envoyé à l'utilisateur (non représenté) à l'étape 103, avertissant l'utilisateur qu'il a été tenté d'effectuer une opération invalide sur le pointeur nul. Lorsque ce message est affiché à l'utilisateur, étape 104, dans un mode de réalisation de l'invention, on s'assure que l'exécution de l'opération concernée est arrêtée à l'étape 104. Lorsque l'exécution de l'opération a été arrêtée à l'étape 104, il peut être souhaitable de terminer l'exécution du programme ou de poursuivre le programme avec une fonctionnalité réduite. À l'étape 105, l'étape suivante désirée est déterminée par le système. Pour certains programmes, il sera entièrement acceptable par le système d'attendre que l'utilisateur corrige l'utilisation non appropriée du pointeur nul avant de poursuivre l'exécution du programme. Dans des applications critiques par rapport au temps, il sera inacceptable d'arrêter l'exécution du programme avant réparation du programme. Dans de tels cas, un état de sécurité ou de récupération doit être identifié et programmé dans le système pour instanciation lorsqu'une utilisation non appropriée du pointeur nul est tentée. Dans l'un ou l'autre cas, l'étape 106 initialise l'action désirée. La figure 2 est un mode de réalisation de la présente invention mise en oeuvre sous la forme d'une classe de modèles de pointeurs en C++. L'instruction 201 s'assure qu'un logiciel de courant d'E/S est disponible pour le courant de sortie 202 qui est utilisé pour mémoriser des messages d'erreur. La classe de modèles 203 déclare une classe de modèles et contient le paramètre appelé C. En C++, une classe de modèles est une classe paramétrée. La classe de modèles possède un caractère variable et nécessite de spécifier un argument pour utiliser la classe. Les arguments inclus modifient le comportement de la classe de modèles. Pendant la compilation, les arguments sont utilisés pour définir la fonctionnalité de la classe. La classe SafePtr 204 définit une classe comprenant des parties publique et privée. La partie publique de la classe SafePtr est visible à tout utilisateur de la classe SafePtr. La partie privée de la classe est destinée à l'usage privé de la classe elle-même. La partie publique de la classe 205 comporte un constructeur pour SafePtr 206. La partie publique décrit la façon dont le pointeur de sécurité lui-même est créé. Une liste d'arguments 207 dans le constructeur 206 contient les arguments sur le constructeur, comportant un pointeur désigné par p. Le "C"dans la liste d'arguments 207 indique que p pointe sur un objet de type C, où C est le paramètre de modèle. La liste d'initialisation de membres 208 initialise le pointeur de membres privés sur l'argument p. Le constructeur reçoit effectivement un pointeur et mémorise le pointeur dans une variable privée appelée fi "ptr". La fonction de membre 209 est une fonction de conversion. La fonction de conversion est utilisée pour convertir le pointeur de sécurité en un pointeur sur C. Si le pointeur spécifique a été demandé comme représenté par la référence 210, un contrôle d'erreur est supposé être effectué sur le pointeur avant qu'il soit utilisé. La ligne 211 montre l'endroit où le programme ayant appelé le pointeur essaie d'utiliser le pointeur sans contrôler le pointeur pour s'assurer qu'il n'est pas un pointeur nul. Sur la ligne 212, un contrôle est effectué pour tester un pointeur nul de façon à pouvoir appeler un traitement d'erreur ou d'exception. Si le pointeur est égal à un pointeur nul, on sort du programme et un message d'avertissement ou similaire est affiché à l'utilisateur. Si le pointeur n'est pas égal au pointeur nul, le pointeur est retourné à l'utilisateur à la ligne 213. La ligne 214 réutilise la partie du code expliquée précédemment, contrôlant que le pointeur utilisé n'est pas un pointeur nul. La ligne 215 commence la partie privée de la classe. La partie privée de la classe est constituée d'une copie privée du pointeur sur l'objet réel ou du pointeur nul auquel le programme de l'utilisateur désire accéder. Lorsqu'ils sont mis en oeuvre par logiciel, les éléments de la présente invention sont essentiellement les segments de code pour exécuter les tâches nécessaires. Le programme ou les segments de code peuvent être mémorisés dans un support lisible par un processeur ou transmis par un signal de données informatique incorporé dans une onde porteuse ou un signal modulé par une porteuse, sur un support de transmission. Le"support lisible par un processeur" peut comporter un support quelconque pouvant mémoriser ou transférer des informations. Des exemples du support lisible par un processeur comportent un circuit électronique, un dispositif mémoire à semi-conducteur, une ROM (Read Only Memory ou mémoire à lecture seule), une mémoire flash et une ROM effaçable (EROM, Erasable Read Only Memory ou mémoire à lecture seule effaçable), une disquette, un disque compact CD-ROM, un disque optique, un disque dur, etc., tandis que les supports de transmission peuvent comporter, par exemple, un support à fibres optiques, une liaison par fréquence radio (RF), etc. Le signal de données informatique peut comporter un signal quelconque pouvant se propager sur un support de transmission tel que des canaux de réseaux électroniques, des fibres optiques, des liaisons aériennes, électromagnétiques, RF, etc. Les segments de code peuvent être téléchargés par l'intermédiaire de réseaux informatiques tels que l'Internet, un intranet, etc. La figure 3 illustre un système informatique 300 adapté pour utiliser la présente invention. Une unité centrale de traitement (CPU) 301 est couplée à un bus de système 302. Le CPU 301 peut être un CPU à usage général quelconque, tel qu'un processeur HP PA-8500 ou Intel Pentium. Toutefois, la présente invention n'est pas limitée à l'architecture du CPU 301, dans la mesure où le CPU 301 supporte les opérations inventées telles qu'ici décrites. Le bus de système 302 est couplé à une mémoire à accès aléatoire (RAM) 303, qui peut être une SRAM (Static RAM ou mémoire à accès aléatoire statique), une DRAM (Dynamic RAM ou mémoire à accès aléatoire dynamique) ou une SDRAM (Synchronous Dynamic RAM ou mémoire à accès aléatoire dynamique synchrone). La ROM 304 est également couplée au bus de système 302, pouvant être une PROM (Programmable ROM ou mémoire à lecture seule programmable), une EPROM (Erasable PROM ou mémoire à lecture seule programmable et effaçable) ou une EEPROM (Electrically EPROM, ou mémoire à lecture seule effaçable et programmable électriquement). La RAM 303 et la ROM 304 contiennent des données et des programmes de l'utilisateur et du système, comme cela est bien connu dans la technique. Le bus de système 302 est également couplé à une carte contrôleur d'entrée/sortie (E/S) 305, une carte d'adaptateur de communication 311, une carte d'interface utilisateur 308 et une carte d'affichage 309. La carte d'E/S 305 connecte des dispositifs de stockage 306, tels qu'un ou plusieurs éléments parmi un disque dur, un lecteur de CD, un lecteur de disquette, une unité de bande, au système informatique. La carte de communication 311 est adaptée pour coupler le système informatique 300 à un réseau 312, qui peut être un ou plusieurs réseaux parmi un réseau téléphonique, un réseau local (LAN) et/ou étendu (WAN), un réseau Ethernet et/où le réseau Internet et peut être une ligne filaire ou sans fil. La carte d'interface utilisateur 308 couple les dispositifs d'entrée de l'utilisateur, tel qu'un clavier 313 et un dispositif de pointage 307, au système informatique 300. La carte d'affichage 309 est commandée par un CPU 301 pour commander le dispositif d'affichage 310. REVENDICATIONS 1. Procédé de mémorisation et de manipulation de pointeurs dans un langage de programmation, dans lequel le langage de programmation supporte un type de pointeur natif et des opérations sur un pointeur standard sur un objet pointeur natif dudit type de pointeur natif, ledit procédé comportant les étapes consistant à : définir un type de pointeur de sécurité (204) supportant lesdites opérations de pointeur standard ; et effectuer un contrôle de pointeur automatique (103-106) en association avec le type de pointeur de sécurité. 2. Procédé selon la revendication 1, dans lequel ledit contrôle de pointeur automatique comporte le contrôle d'un pointeur nul (101). 3. Procédé selon la revendication 1, dans lequel ledit contrôle de pointeur automatique comporte le contrôle d'un alignement de pointeur incorrect (202). 4. Procédé selon la revendication 1, comprenant en outre une étape consistant à exécuter un traitement d'erreur (104-106). 5. Procédé selon la revendication 4, dans lequel ledit traitement d'erreur comporte au moins une action parmi la production d'un message d'erreur (103) et l'arrêt de l'exécution du programme (104) ; la production d'un message d'avertissement sans arrêter l'exécution du programme ; et l'appel d'un sousprogramme de traitement d'erreur défini par l'utilisateur (106). 6. Procédé selon la revendication 1, comprenant en outre les étapes consistant à : appeler une fonction (211) qui retourne comme valeur un objet dudit type de pointeur de sécurité ; et exécuter lesdites opérations de pointeur standard sur ledit objet. 7. Procédé selon la revendication 1, comprenant en outre les étapes consistant à : lire une variable globale dudit type de pointeur de sécurité ; et exécuter ladite opération de pointeur standard sur ledit objet. 8. Procédé selon la revendication 1, comprenant en outre les étapes consistant à : appeler une fonction qui retourne comme valeur un objet dudit type de pointeur de sécurité, ledit objet encapsulant un objet pointeur natif incorrect ; et exécuter un traitement d'erreur en réponse audit objet pointeur natif incorrect. 9. Procédé selon la revendication 1, dans lequel ledit objet pointeur natif incorrect est constitué d'un parmi un pointeur nul 101, un pointeur désaligné et une mauvaise utilisation dudit pointeur dans le contexte. 10. Procédé selon la revendication 1, comprenant en outre les étapes consistant à : lire une variable globale encapsulant un objet pointeur natif incorrect ; et exécuter un traitement d'erreur (202) en réponse audit objet pointeur natif incorrect.