Доступ к буферу вне границ в cppcheck - PullRequest
0 голосов
/ 13 декабря 2018

Код может быть скомпилирован, и результат в порядке.Но cppcheck сообщит об ошибке.

#define BUF_SIZE     1024
#define MAX_LENG     80

static unsigned char path[MAX_LENG];
unsigned char file_buf[BUF_SIZE*2];

memset(file_buf, 0, sizeof(file_buf));
strcpy(file_buf, "KID ");
strncat(file_buf, &path[strlen(path)-12], 10); //error this line

Я пытался несколько раз, но до сих пор не могу найти причину.Кто-нибудь может дать мне несколько советов?

Спасибо за все ответы.

но у меня есть еще вопросы: если это фатальная ошибка, почему пропущен компилятор, а результат - то, что я хочу?При каких условиях у него будут проблемы?

Есть какой-нибудь альтернативный способ реализовать это?

И если я заменил его на

strncat(file_buf, &path[strlen(path)-12], 5);

, ошибка cppcheack исчезнет.Почему?

Ответы [ 2 ]

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

Этот здесь буфер:

static unsigned char path[MAX_LENG];

Статичен и поэтому инициализируется нулем.Первый символ равен 0, когда этот код выполняется впервые.Таким образом, strlen(path) собирается вернуть (size_t)0.Вычтите 12 из этого, и вы получите очень большое число без знака из-за модульной арифметики, число, которое определенно больше, чем 1024.

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

Вы получаете доступ к массиву с слишком большим индексом:

static unsigned char path[MAX_LENG];

Будучи static, он инициализируется нулями.Это означает, что strlen(path) вернет 0.

strncat(file_buf, &path[strlen(path)-12], 10);

Здесь вы вычтете 12, которое будет равно -12, но, поскольку strlen возвращает значение без знака, результирующий индекс будет SIZE_MAX-12, что явно выходит за пределы.

...