【问题标题】:How to resolve GCC compilation [-Wformat] warning?如何解决 GCC 编译 [-Wformat] 警告?
【发布时间】:2020-02-16 19:02:27
【问题描述】:

我正在使用this approach 将十六进制字符串转换为字节数组。代码工作正常。 在编译此代码时,我收到低于编译警告。有什么办法可以解决吗?

/* 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]);
                       ~~~~   ^~~~~~~~~

【问题讨论】:

  • format specifies type 'unsigned int *' but the argument has type 'uint8_t *' (aka 'unsigned char *') 在上述消息中的什么时候事情变得不清楚?
  • 在这一行:sscanf(hexstring, "%02x", &input[I]) @n.m.
  • @raj123 大错特错
  • “我刚刚将 uint8*t 类型转换为 unsigned int*”。这是未定义的行为。你不能只对问题投掷石膏并希望它们消失。
  • scanf 文档应该向您展示的更简单的解决方案是%hhx

标签: c scanf compiler-warnings conversion-specifier


【解决方案1】:

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;
   }

【讨论】:

  • 一个更简单的解决方案是%hhx
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 2011-01-16
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多