2

浮動小数点例外のシグナル ハンドラで Linux C コードをデバッグしています。目標は、浮動小数点レジスタをチェックし、いくつかの情報を出力してから中止することです。の結果を印刷しようとすると、セグメンテーション違反が発生し(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)
    ...
}

(char)('0' + phyreg)別の行に移動して結果を一時変数に保存すると、printfが一時変数を表示しようとするまでセグメンテーション違反が発生しないため、問題は計算ではありません。では、segfault を引き起こすバグはどこにあるのでしょうか?

4

3 に答える 3

7

%s で印刷しています。「FP %c: 仮数 = %s」のはずです。

于 2009-02-13T16:51:21.957 に答える
3

%s は文字列を意味し、文字を指定しています。この文字値は、printf によって、出力する文字列の最初の文字へのポインタとして解釈されますが、もちろん恐ろしく失敗します。

文字を 2 つの要素 (2 番目は '\0') を持つ文字配列に入れるか、printf に文字として評価されるものがあるかどうかを確認します。

于 2009-02-13T16:52:23.047 に答える
3

(-で終わる文字列に使用する必要があります)の代わりに、1 つの文字に%c 書式指定子を使用します。%snull

于 2009-02-13T16:52:40.690 に答える