Ошибка переполнения буфера при передаче значения массива в другую функцию - PullRequest
0 голосов
/ 28 декабря 2018

Я написал функцию для передачи массива широких символов в другую функцию.После запуска отчета анализа я получаю следующую ошибку

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.Мой первый вопрос, как он принимает массив Overrunning "массив" из 12 байтов?Любое решение этой проблемы.или что-то я здесь скучаю?Любое предложение?

1 Ответ

0 голосов
/ 28 декабря 2018

Вы передаете указатель на 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 вместе.

Включите предупреждения (например, -Wall -Wextra в gcc / clang) и проследите за каждым из них.Проблему легко определить следующим образом:

<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);
                    ^~~~~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...