cppcheck: доступ к буферу выходит за пределы - PullRequest
2 голосов
/ 28 января 2020

У меня есть код ниже. После запуска инструмента cppcheck он сообщает об ошибке при доступе к буферу за пределами? Ошибка сообщается в строке с snprintf.

#include <stdio.h>

int main(int argc, char * argv[])
{
    if (argc > 1) {
        char testref[8] = "";
        snprintf(testref, sizeof(testref), "Ref:%s", argv[1]);
        printf("===>testref=%s\n", testref);
    }
}

ниже взаимодействия командной строки:

amin@ubuntu:$ gcc test.c -o test
amin@ubuntu:$ 
amin@ubuntu:$ ./test hello_world
===>testref=Ref:hel
amin@ubuntu:$ cppcheck test.c 
Checking test.c...
[test.c:7]: (error) Buffer is accessed out of bounds.
amin@ubuntu:$

Правильно ли cppcheck сообщить об этой ошибке?

1 Ответ

2 голосов
/ 28 января 2020

Я думаю, что, вообще говоря, cppcheck правильно сообщить об этой ошибке. Поведение функции snprintf зависит от реализации, и в некоторых реализациях не гарантируется, что нулевой символ записывается, если строка слишком велика для буфера. В таком случае последовательный вызов printf() будет читать за пределами буфера.

Я мог бы найти хотя бы один пример реализации snprintf, который привел бы к выходу ошибки для вашего кода. И согласно этому комментарию это также относится к True64 / Digital Unix до c99.

Было бы интересно посмотреть, если cppcheck также сообщает об ошибке для следующего кода (это не должен сообщать об ошибке):

#include <stdio.h>

int main(int argc, char * argv[])
{
    if (argc > 1) {
        char testref[8] = "";
        int ret = snprintf(testref, sizeof(testref), "Ref:%s", argv[1]);
        if (ret >= 0) {
            printf("===>testref=%s\n", testref);
        }
    }
}

Также обратите внимание, что Cppcheck версии 1.82 не сообщает об ошибке для вашего кода. Я не уверен, почему версия 1.72 сообщает об ошибке, а версия 1.82 - нет.

...