Accueil Product Support IT Modernization Signal 11 à l'exécution d'un programme C suite à migration de 32 vers 64 bits

Signal 11 à l'exécution d'un programme C suite à migration de 32 vers 64 bits

Résolution de l'erreur "segmentation violation" (signal 11) à l'exécution d'un programme C compilé avec -q64

 

ProduitLangage 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");
}


La compilation du programme par la commande :
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:

> malloctest

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)
L'abort s'est produit sur la ligne 14, correspondant à l'instruction "strcpy(p1, "test\n\0");" qui utilise le pointeur corrompu retourné par malloc.

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"

— Mots-clés associés :
Demande d'assistance
Création et suivi
Recherche