GDB представление неподписанного символа - это противоречиво? - PullRequest
0 голосов
/ 01 марта 2012

Я отлаживал segfault в каком-то числовом коде (C ++, никаких зависимостей от каких-либо внешних библиотек).Я получил его, воспроизводящий segfault при компиляции на уровне оптимизации -O0 (с использованием gcc) и запуске в gdb;полученная обратная трассировка:

(gdb) backtrace 2
#0  0x000000000040171c in QExpFloorLog_Q_R (q=Cannot access memory at address 0x7fffff7fefec) at GlobalFunctions.hpp:11
#1  0x0000000000401b50 in MinExponentFromTheoremTwo (q=2, k_q=20 '\024', r=1122053) at GlobalFunctions.hpp:90

Подпись MinExponentFromTheoremTwo:

unsigned char MinExponentFromTheoremTwo(const unsigned int q, const unsigned char k_q, const unsigned int r);

Итак, мой вопрос: что я должен сделать из k_q=20 '\024'?Я понимаю, что k_q является беззнаковым символом, и поэтому GDB дает мне как числовое значение, так и представление ascii;У меня есть другие места с беззнаковыми переменными char, перечисленными как var1=0 '\000', var2=1 '\001' и т. Д. Но k_q кажется несовместимым со значением 20 и кодом \ 024.Я неправильно понимаю, как используются unsigned char, или это должно помочь мне найти ошибку в моем коде?

Кстати, у меня есть

$ uname -a
Linux clayton-AOD255E 2.6.38-13-generic #53-Ubuntu SMP Mon Nov 28 19:33:45 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
$ gdb --version
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2

Спасибо за любую помощь!

1 Ответ

2 голосов
/ 01 марта 2012

Число, называемое двадцать, представлено в базе 10 как «20».В базе 8 это «24».\024 является восьмеричным представлением этого значения.

Все следующие значения являются одинаковыми:

20     // decimal, base-10
024    // octal, base-8
'\024' // octal, base-8
0x14   // hex, base-16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...