无法解决 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()
操作即时创建格式字符串创建格式字符串,然后再使用它。
面临我无法解决的警告。我正在使用带有标准 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()
操作即时创建格式字符串创建格式字符串,然后再使用它。