Segfault lors de l'utilisation printf
-
23-08-2019 - |
Question
Je suis le débogage du code Linux C dans un gestionnaire de signaux pour les exceptions à virgule flottante. L'objectif est de vérifier les registres à virgule flottante, imprimer des informations, puis abandonner. Je reçois une erreur de segmentation lors d'une tentative de printf le résultat de (char)('0' + phyreg)
.
struct ucontext * uc = (struct ucontext *) data;
fpregset_t fp = uc -> uc_mcontext.fpregs;
int top = (fp -> sw >> 11) & 0x07;
int i,j,k;
for (i = 0; i < 8; i++) {
static const char * tags [] = {
"valid", "zero", "invalid/infin", "empty"
};
int phyreg = (top + i) & 0x07;
struct _libc_fpreg* r = &(fp -> _st [phyreg]);
const char* regExp = (((r->exponent & 0x8000) != 0) ? "-" : "+");
printf (" FP %s: Mantissa= %s",
(char) ('0' + phyreg), // reg stack (SIGSEGV here)
regExp); // register exponent sign
j = (r->significand[3] >> 15) & 0x01;
printf ("%s.",(char) ('0' + j)); // mantissa (Also SIGSEGV here when
// previous SIGSEGV is commented out)
...
}
Il est pas le calcul de (char)('0' + phyreg)
qui est le problème, parce que quand je me déplace à une ligne distincte et stocker le résultat dans une variable temporaire, je ne suis pas le segfault jusqu'à ce que le printf essaie d'afficher la variable temp. Alors, où est le bug qui provoque le segfault?
La solution
Vous imprimez avec% s. Devrait être "FP% c: Mantisse =% s".
Autres conseils
% s signifie une chaîne, vous donnez un caractère. Cette valeur de caractère est interprété par printf comme pointeur sur le premier caractère de la chaîne à imprimer, qui bien sûr ne pas horibbly.
Mettre le caractère dans un tableau de caractères à 2 éléments, la seconde étant « \ 0 », ou si printf a quelque chose qui évalue un caractère.