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
。因此,作为第一个参数传递的缓冲区应至少具有sizesizeof(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
。