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

时间:2018-12-28 08:25:42

标签: 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)swprintf(array, 6,get_wide_char((void *)"%0d"),  40);
    function2(array);
}

function2(char* value)
{

}

char的大小为1个字节,数组的大小为6个。我的第一个问题是如何处理12个字节的Overrunning数组“ array”?任何解决此问题的方法。还是我在这里想念的东西?有什么建议吗?

1 个答案:

答案 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),因此缓冲区溢出。

请勿混用charwchar_t操作。要么一起使用wchar_tswprintf,要么一起使用charsprintf

启用警告(例如,在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);
                    ^~~~~