Rational Developer for AIX and Linux fournit des outils d'analyse statique qui peuvent analyser votre code pour y rechercher des sources potentielles d'erreur que vous pourriez rencontrer lors de la migration vers AIX ou Linux on POWER à partir d'une autre plateforme. Pour plus d'informations sur l'exécution de règles d'analyse statique, voir Exécution de règles d'analyse statique.
Cette rubrique est une courte présentation de certaines règles d'analyse statique qu'il peut être particulièrement utile d'exécuter sur votre code lors de la migration depuis une autre plateforme.
| Catégorie | Règle | Objectif | Exemples |
|---|---|---|---|
| Problèmes de migration au niveau du matériel | |||
| Problèmes de type Endian avec les données | Détecte le code qui est susceptible de transférer des données d'une structure de données vers une autre d'une façon incorrecte pour la configuration Endian de l'architecture matérielle actuelle. | char buffer[100];
// ces instructions doivent être indiquées comme étant de possibles problèmes de type Endian int32_t myInt = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; myInt = *((int *)buffer); |
|
| Problèmes de migration de 32 bits vers 64 bits | |||
| Les appels à des fonctions système 32 bits doivent être évités. | Détecte les appels à des fonctions système 32 bits | #include <stdio.h>
#include <unistd.h> #include <fcntl.h> #include <limits.h> int main() { int f; if ( f=open("data_file",O_RDWR) < -1) return -1; off_t offset = lseek32(f,LLONG_MAX,SEEK_CUR); return offset; } |
|
| size_t doit être utilisé au lieu des autres types d'entiers lors de certains types d'appels système | Détecte l'utilisation de types d'entiers où size_t doit être utilisé pour l'assignation depuis un type de retour de fonction/méthode ou lors du passage de paramètres. | char c = strnlen(“hello”,LLONG_MAX); | |
| L'utilisation de spécificateurs de format de chaîne qui changent de comportement entre des applications 32 bits et 64 bits n'est pas recommandée. |
printf("Hello %l",99); // “long” printf("Hello %z",99); // “size_t” printf("Hello %j",99); // “intmax_t” printf("Hello %t",99); // “ptrdiff_t” |
||
| Problèmes de migration au niveau du système d'exploitation | |||
| Les appels système spécifiques à un système d'exploitation doivent être évités. | Détecte l'utilisation d'appels système qui sont spécifiques à des systèmes d'exploitation autres que AIX et Linux. |
processorid_t i, cpuid_max;
cpuid_max = sysconf(_SC_CPUID_MAX); for (i = 0; i <= cpuid_max; i++) { // p_online() est un appel système spécifique au système d'exploitation Solaris® et cette utilisation sera indiquée if (p_online(i, P_STATUS) != -1) printf("processor %d present\n", i); } |
|
| Les sémaphores POSIX doivent être évités sur certaines versions d'AIX. | Détecte l'utilisation de certains appels de sémaphores POSIX qui ne sont pas implémentés dans certaines versions d'AIX. | sem_t sem_name;
int* ip; sem_init(&sem_name, 0, 10); sem_wait(&sem_name); sem_post(&sem_name); sem_getvalue(&sem_name, ip); sem_destroy(&sem_name); |
|
| Les références à des valeurs de signaux symboliques non portables doivent être évitées. | Détecte des références à des valeurs de signaux symboliques non portables qui ne sont pas disponibles sur AIX ou Linux. | switch (sig) {
case SIGEMT: case SIGLWP: case SIGWAITING: case SIG_FREEZE: case SIGTHAW: case SIGCANCEL: case SIGLOST: case SIGXRES: printf("Signal: %d\n",sig); } |
|
| Les gestionnaires de signaux doivent référencer des numéros de signaux uniquement de façon symbolique. | Détecte des cas dans les gestionnaires de signaux qui utilisent des constantes numériques codées en dur pour des valeurs de signaux à la place des noms symboliques. Les valeurs de signaux réelles varient selon certains systèmes d'exploitation. | void my_handler(int sig) {
switch (sig) { case 0: // diagnostic. printf("0\n"); break; } } int main() { struct sigaction action; action.sa_handler = my_handler return sigaction(99,&action,NULL); } |
© Copyright IBM Corporation 2013. All Rights Reserved.