Как разрешить предупреждение компиляции GCC [-Wformat]? - PullRequest
0 голосов
/ 20 октября 2019

Я использую этот подход для преобразования шестнадцатеричной строки в байтовый массив. Код работает правильно. При компиляции этого кода я получаю предупреждение ниже компиляции. Есть ли способ, как я могу решить это?

/* test.c */
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    if (argc < 2)
    {
        printf("Usage: ./test <input hex string>\n");
        return 0;
    }

    char *hexstring = argv[1];
    printf("hextring:%s\n", hexstring);
    uint8_t str_len = strlen(hexstring);
    printf("length:%d\n", str_len);
    uint8_t array_size = str_len / 2;
    printf("array_size:%d\n", array_size);
    uint8_t *input = (uint8_t *)calloc(array_size, sizeof(uint8_t));

   for (int i = 0; i < array_size; i++)
   {
       sscanf(hexstring, "%02x", &input[i]);
       hexstring = hexstring + 2;
   }
   for (int i = 0; i < array_size; i++)
   {
       printf("input[%d]:[%.2x]\n", i, input[i]);
   }
return 0;
}

Предупреждение компиляции:

gcc test.c -o test
test.c:24:34: warning: format specifies type 'unsigned int *' but the argument has type 'uint8_t *' (aka 'unsigned char *') [-Wformat]
    sscanf(hexstring, "%02x", &input[i]);
                       ~~~~   ^~~~~~~~~

1 Ответ

3 голосов
/ 20 октября 2019

Размер uint8_t обычно меньше, чем один из unsigned int, поэтому ваш код кажется сработало .

Вы должны использовать правильный спецификатор формата.

Добавьте

#include <inttypes.h>

в начале вашего кода и измените формат "%02x" на "%02" SCNx8.

Макрос SCNx8 будет расширен до правильного спецификатора формата и подключенна "%02" часть.

Если, к сожалению, это не поддерживается в вашей среде, другой способ - использовать буфер с правильным типом для чтения значения.

   for (int i = 0; i < array_size; i++)
   {
       unsigned int buffer = 0;
       sscanf(hexstring, "%02x", &buffer);
       input[i] = (uint8_t)buffer;
       hexstring = hexstring + 2;
   }
...