Я думаю, что, вообще говоря, 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 - нет.