Segfault при использовании printf - PullRequest
2 голосов
/ 13 февраля 2009

Я отлаживаю код 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), потому что когда я перемещаю его в отдельную строку и сохраняю результат во временной переменной, я не получаю segfault, пока printf не попытается отобразить временную переменную. Итак, где же ошибка, вызывающая segfault?

Ответы [ 3 ]

7 голосов
/ 13 февраля 2009

Вы печатаете с% s. Должно быть "FP% c: Mantissa =% s".

3 голосов
/ 13 февраля 2009

Используйте спецификатор формата %c для одного символа вместо %s (который должен использоваться для строки, определяемой null).

3 голосов
/ 13 февраля 2009

% s означает строку, вы даете ей символ. Это символьное значение интерпретируется printf как указатель на первый символ строки для печати, которая, конечно, будет ужасно терпеть неудачу.

Поместите символ в массив символов с 2 элементами, вторым является '\ 0', или посмотрите, есть ли у printf что-то, что оценивает символ.

...