Segfault wenn printf
-
23-08-2019 - |
Frage
Ich bin Debuggen einig Linux-C-Code in einem Signal-Handler für Punkt Ausnahmen schweben. Das Ziel ist es, das Floating-Point-Register zu überprüfen, einige Informationen drucken, und dann abbrechen. Ich erhalte einen Segmentation Fault bei dem Versuch, das Ergebnis der (char)('0' + phyreg)
printf.
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)
...
}
Es ist nicht die Berechnung der (char)('0' + phyreg)
das ist das Problem, denn wenn ich es in eine separaten Zeile zu bewegen und das Ergebnis in einer temporären Variablen speichern, ich habe nicht die segfault erhalten, bis die printf die temporäre Variable anzuzeigen versucht. Also, wo ist der Fehler, der die segfault verursacht?
Lösung
Sie drucken mit% s. Sollte "FP% c: Mantissa =% s".
Andere Tipps
% s bedeutet eine Zeichenfolge, können Sie ihm ein Zeichen geben. Dieser Zeichenwert von printf als Zeiger auf das erste Zeichen des Strings interpretiert wird, zu drucken, das natürlich fehl horibbly.
Setzen Sie das Zeichen in einen Zeichen-Array mit 2 Elementen, das zweite Wesen ‚\ 0‘ ist, oder ob printf hat etwas, das zu einem Zeichen auswertet.
Mit dem %c
Formatspezifizierer für ein einzelnes Zeichen, statt %s
(die sollte für ein null
terminierten String verwendet werden).