【问题标题】:Overrunning buffer issue while passing array value to another function将数组值传递给另一个函数时溢出缓冲区问题
【发布时间】:2018-12-28 08:25:41
【问题描述】:

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

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 字节的溢出数组“数组”?这个问题的任何解决方案。或者我在这里缺少什么?有什么建议吗?

【问题讨论】:

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

标签: c arrays string function


【解决方案1】:

您将一个指向 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);
                    ^~~~~

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2013-07-19
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2010-10-11
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多