xlc ++ et g ++
Le compilateur xlc ++ est utilisé sous AIX et le compilateur g ++ est utilisé sous Linux.
Pour les comportements qui ne sont pas strictement définis dans le standard C, les méthodes de traitement des deux compilateurs ne sont pas forcément les mêmes et le code se comportera différemment lors de l'exécution sur les deux plates-formes. En conséquence, il fonctionne normalement sur une plate-forme, mais l'autre plate-forme peut être un bogue.
Les problèmes sont concentrés dans les domaines suivants
Exemple de code dangereux | compilateur xlc ++ | compilateur g ++ | Approche |
---|---|---|---|
s = "12" <br> sprintf (r, "% 04s", s); | s contient moins de quatre chiffres pour compléter "0" <br> r = "0012" | s contient moins de quatre caractères vides remplis à gauche "" <br> r = "12" | Ajouter un code de vérification <br> char p = r; <br> for (; p == ''; ++ p) <br> * p = '0'; |
Lorsque fichier descripteur de fichier = NULL, <br> écrit le contenu fprintf (fichier, "..."); | Impossible d'écrire, le programme continue de s'exécuter vers le bas | plantage du programme | Ajouter un jugement <br> if (file! = NULL) |
memcpy copie les données du tableau hors des limites | Les adresses parmi les variables sont dispersées et le tableau lui-même est hors limites, ce qui n'a aucun effet sur les autres variables, et des résultats normaux peuvent généralement être obtenus. | Les adresses des variables sont étroitement adjacentes et le tableau lui-même est hors limites, et la valeur de la variable définie de manière adjacente sera également écrasée, ce qui entraînera des résultats anormaux. | Vérifiez la longueur de la mémoire copiée à l'emplacement correspondant pour éviter de franchir la limite |
La structure s contient une double variable a, qui n'est pas initialisée avant utilisation | une valeur par défaut 0.0 | a La valeur par défaut est un très grand nombre positif, provoquant le blocage du programme | Augmenter le memset de traitement initial (& s, '\ 0', sizeof (s)); |
Système 32 bits et système 64 bits
Si l'une des deux plates-formes est une version 32 bits et l'autre une version 64 bits, la longueur de certaines variables changera. Les endroits qui nécessitent une attention sont les suivants:
Type de variable | Système 32 bits | Système 64 bits | Code et traitement dangereux |
---|---|---|---|
longue | 4 octets | 8 octets | Évitez d'utiliser sizeof (long) pour obtenir la valeur de longueur |
aiguille | 4 octets | 8 octets | Le troisième paramètre de certains memcpy et strncpy dans le code est sizeof (pointeur). Après la migration, la longueur de la mémoire copiée change (4 devient 8) et le résultat est anormal. Il doit être modifié en fonction de la situation pour éviter d'utiliser sizeof pour manipuler des variables dont la longueur varie avec la plateforme. Lorsque le nom du tableau est utilisé comme paramètre, il équivaut également à un pointeur et l'opération sizeof ne doit pas être effectuée. |