GCC 4.6.3 против 4.7.3: разница в печати greg_t для x86_64

Я пытаюсь исправить ошибку сборки.

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

fprintf(crashLog, "RIP: %lX\n", context->uc_mcontext.gregs[REG_RIP]);

И поэтому:

  • gregs имеет тип gregset_t
  • gregs [i] имеет тип greg_t

Теперь этот код (предназначенный для создания дампов ядра и трассировки стека) работает очень давно, но в последнее время GCC 4.7.3 (Ubuntu 13.04) начал его отклонять:

error: format ‘%lX’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘greg_t {aka long long int}’ [-Werror=format]

Хорошо. Поэтому я изменяю оскорбительную строку на:

fprintf(crashLog, "RIP: %llX\n", context->uc_mcontext.gregs[REG_RIP]);

Но вместо этого GCC 4.6.3 (Ubuntu 12.04) жалуется:

error: format ‘%llX’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘greg_t {aka long int}’ [-Werror=format]

В этом разделе кода уже есть ifdef для различных регистров, так что я могу добавить еще один, но есть ли хороший чистый способ сделать это (особенно без необходимости дополнительного ifdef)?

0 ответов

Другие вопросы по тегам