Variables de classe d'exit
Les clauses associées à un point d'analyse situé aux points de sortie d'un appel système ou d'une fonction utilisateur peuvent accéder à la valeur de retour de l'appel système ou de la fonction utilisateur.
Il n'existe qu'une seule variable de classe d'exit définie par le langage Vue . Il s'agit de la valeur de retour d'une fonction ou d'un appel système, accessible à l'aide du nom de variable intégré spécial __rv.
Les sondes aux points de sortie sont prises en charge par le gestionnaire de sondes d'appel système. Par exemple, l'appel système read renvoie le nombre réel d'octets lus ou un code de retour d'erreur de -1. Cette valeur renvoyée est accessible à partir du point d'analyse @@syscall: * :read:exit , qui identifie tous les points d'exit de l'appel système de lecture.
Comme pour les variables de classe d'entrée, l'utilisation de variables de classe d'exit dans une clause Vue n'est possible que si la spécification de sonde associée à la clause identifie un point de sonde unique. Par conséquent, __rv ne peut pas être utilisé dans une clause Vue dont plusieurs points de sonde sont spécifiés dans la spécification de sonde. En outre, la déclaration de style C de la fonction vérifiée, en particulier le type de données de la valeur de retour, doit être explicitement fournie dans le script Vue. En fait, il est erroné de spécifier une déclaration de fonction sans fournir son type de retour.
Vous pouvez utiliser des variables de classe d'exit dans la section de prédicat d'une clause.
Le script suivant est un script non conforme et entraîne l'échec du compilateur ProbeVue avec une erreur de syntaxe car le type de retour de la fonction read n'est pas spécifié:
/* Bad example. */
int read(int fd, char *buf, unsigned long size);
@@syscall:*:read:exit
when (__rv > 0)
{
/* Entered on read success: return value = # of bytes read */
printf("Number of bytes read = %d\n", __rv);
}
Le script modifié suivant peut fonctionner:
/* Good example. */
int read(int fd, char *buf, unsigned long size);
@@syscall:*:read:exit
when (__rv > 0)
{
/* Entered on read success: return value = # of bytes read */
printf("Number of bytes read = %d\n", __rv);
}