Development
Produit | Langage C |
Version | 8.0 |
OS | Aix 5 |
Problème
Un programme compilé avec le C 64 bits (option -q64) aborte à l'exécution avec l'erreur "Memory fault" (signal 11) , et génère un core.
La compilation avec l'option -qwarn64 retourne le warning: "possible incorrect pointer through conversion of int type into pointer."
Solution
Cette erreur peut survenir si les fonctions prototypes ne sont pas déclarée dans le programme.
Si la fonction prototype, d'une fonction retournant un pointeur, n'est pas déclarée, la fonction rendra une valeur tronquée (le type implicite de retour d'une fonction est un "int" sur 32 bits, au lieu du pointeur sur 64 bits attendu).
L'une des fonctions retourne un pointeur tronqué, à l'origine de l'abort avec "memory fault".Après ajout des déclarations des fonctions prototypes, le programme s'exécute correctement.
Exemple
Exemple testé sur AIX 5.3, avec le compilateur C V8
Source du programme malloctest :
#include <stdio.h>
#define SIZE 200
extern int errno;
main()
{
char *p1;
printf ("Avant allocation.\n");
if (NULL == ( p1=(char *)malloc(SIZE))) {
puts("Impossible d'allouer la mémoire.");
printf("erreur malloc = %d\n", errno);
exit(1);
}
strcpy(p1, "test\n\0");
free ( p1 );
printf("erreur free = %d\n", errno);
printf ("Après libération.\n");
}
cc -g -qwarn64 -q64 -o malloctest malloctest.c
retourne le warning:
"malloctest.c", line 9.26: 1506-745 (I) 64-bit
portability:
possible incorrect pointer through conversion of int type into
pointer.
Le warning 1506-745, retourné lors de la compilation sur la ligne
correspondant à malloc. indique que le pointeur rendu par malloc
pourrait être tronqué.
Exécution:
> malloctestL'abort s'est produit sur la ligne 14, correspondant à l'instruction "strcpy(p1, "test\n\0");" qui utilise le pointeur corrompu retourné par malloc.
Avant allocation.
Memory
fault(coredump)
> dbx malloctest
Segmentation fault in strcpy.strcpy [malloctest] at 0x100000678
0x100000678 (strcpy+0xb8) 9ce50001 stbu r7,0x1(r5)
(dbx) where
strcpy.strcpy() at 0x100000678
main(), line 14 in "malloctest.c"
(dbx)
Le problème est résolu en
ajoutant dans le programme, le fichier "include"
stdlib.h (#include
<stdlib.h>) qui décrit
la fonction prototype de malloc.
Documentation
Redbook "Aix 5L
porting guide"
Section 3.8,
?Pointer assignment and arithmetic? et Section 12.1.1
"Small example"