我写了一个函数,将宽字符数组传递给另一个函数。运行分析报告后,出现以下错误
Overrunning array "array" of 12 bytes by passing it to a function which accesses it at byte offset 130.
我的逻辑:
static char array[6];
function1()
{
(void) memset(&array, 0, sizeof(array));
(void)swprintf(array, 6,get_wide_char((void *)"%0d"), 40);
function2(array);
}
function2(char* value)
{
}
char的大小为1个字节,数组的大小为6个。我的第一个问题是如何处理12个字节的Overrunning数组“ array”?任何解决此问题的方法。还是我在这里想念的东西?有什么建议吗?
答案 0 :(得分:3)
您正在将指向6个元素的char
数组的指针传递给swprintf
,该数组期望将wchar_t
指针作为第一个参数,并将字符数(不是字节)写为第二个论点。
wchar_t
可能大于char
,可能是sizeof(wchar_t) == 2
。因此,作为第一个参数传递的缓冲区的大小应至少为sizeof(wchar_t)*6
(可能为12
)。情况并非如此(sizeof(char)
始终是1
,所以sizeof(array) == 6
),因此缓冲区溢出。
请勿混用char
和wchar_t
操作。要么一起使用wchar_t
和swprintf
,要么一起使用char
和sprintf
。
启用警告(例如,在gcc / clang上为-Wall -Wextra
),并对每个警告进行跟进。通过这种方式很容易发现问题:
<source>:11:20: warning: passing argument 1 of 'swprintf' from incompatible pointer type [-Wincompatible-pointer-types]
(void)swprintf(array, 6,get_wide_char((void *)"%0d"), 40);
^~~~~