C 将数组值传递给另一个函数时出现缓冲区溢出问题

C 将数组值传递给另一个函数时出现缓冲区溢出问题,c,arrays,string,function,C,Arrays,String,Function,我编写了一个函数,将宽字符数组传递给另一个函数。运行分析报告后,我发现以下错误 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)swp

我编写了一个函数,将宽字符数组传递给另一个函数。运行分析报告后,我发现以下错误

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)
{

}

这里的字符大小为1字节,数组大小为6。我的第一个问题是,如何使12字节的数组“array”溢出?这个问题的任何解决方案。或者我在这里遗漏了什么?有什么建议吗?

您正在将一个指向6元素
char
数组的指针传递给
swprintf
,该数组需要一个
wchar\u t
指针作为第一个参数,需要写入的字符数(而不是字节数)作为第二个参数

wchar\u t
可能大于
char
,可能
sizeof(wchar\u t)==2
。因此,作为第一个参数传递的缓冲区应至少具有size
sizeof(wchar\u t)*6
(可能是
12
)。情况并非如此(
sizeof(char)
总是
1
,因此
sizeof(array)==6
)因此存在缓冲区溢出

不要混合使用
char
wchar\t
操作。一起使用
wchar\u 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);
                    ^~~~~
:11:20:警告:从不兼容的指针类型[-Wincompatible指针类型]传递“swprintf”的参数1
(void)swprintf(数组,6,get_-wide_-char((void*)%0d),40);
^~~~~

两个注意事项:请指定编程语言并清理代码,例如避免使用宏和解析别名以使其清晰。哦,还要避免强制转换并打开编译器警告!什么是
get\u wide\u char
?如果打开“警告”,您将看到:1。您应该在函数2上添加显式返回类型。您缺少
函数2
的转发声明。3.您正在将不兼容的指针类型传递给
swprintf