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?

Était-ce utile?

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.

Utilisez le spécificateur Format %c pour un seul caractère, au lieu de %s (qui doit être utilisé pour une chaîne terminée par null-).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top