无法解决 C 中的 snprintf 警告

Can't resolve snprintf warning in C

面临我无法解决的警告。我正在使用带有标准 C11 编译器的 stm32 MCU 和 STM32CubeIDE。我可以通过增加数组 gStr 的大小轻松摆脱警告,但想知道这里的问题是什么。 gStr 的当前大小看起来足以容纳给定的数据。 任何帮助表示赞赏。谢谢!

所用变量的全局定义如下所示:

#define LOG_ERROR_FILENAME_MAX_LEN  30
#define LOG_ERROR_MAX_ENTRY 30
#define LOG_GSTR_SIZE   128     //changed from 128 to 2048 to remove warning

typedef struct
{
    char fileName[LOG_ERROR_FILENAME_MAX_LEN];
    u16 line;
    u16 hits;
} LogEntryType;

static LogEntryType gLogEntrys[LOG_ERROR_MAX_ENTRY];
u8 gLogEntryCount = 0;
static char gStr[LOG_GSTR_SIZE];

生成警告的函数调用如下所示:

snprintf(gStr, LOG_GSTR_SIZE, "%s line:%u hits:%u",gLogEntrys[i].fileName, gLogEntrys[i].line, gLogEntrys[i].hits);

snprintf 调用生成以下警告

../User/Utils/log_error.c: In function 'cliCmdDisplayLog':
../User/Utils/log_error.c:54:36: **warning**: '%s' directive output may be truncated writing up to 1019 bytes into a region of size 128 [-Wformat-truncation=]
   54 |     snprintf(gStr, LOG_GSTR_SIZE, "%s line:%u hits:%u",
      |                                    ^~
../User/Utils/log_error.c:54:35: note: directive argument in the range [0, 65535]
   54 |     snprintf(gStr, LOG_GSTR_SIZE, "%s line:%u hits:%u",
      |                                   ^~~~~~~~~~~~~~~~~~~~
../User/Utils/log_error.c:54:35: note: directive argument in the range [1, 65535]
../User/Utils/log_error.c:54:5: note: 'snprintf' output between 15 and 1042 bytes into a destination of size 128
   54 |     snprintf(gStr, LOG_GSTR_SIZE, "%s line:%u hits:%u",
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   55 |      gLogEntrys[i].fileName, gLogEntrys[i].line, gLogEntrys[i].hits);
      |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

从症状来看,我认为您的问题是作为 GCC Bug 95755 报告给 GCC 的问题的变体,已于 2020 年 6 月报告,但尚未修复。

在对报告的回复中有一个大纲解决方法。您需要在格式字符串中使用限制(%*.*s%.*s,使用指定长度的整数),或者您需要使用一个 snprintf() 操作即时创建格式字符串创建格式字符串,然后再使用它。