- PVSM.RU - https://www.pvsm.ru -
После появления переводной статьи про Статический анализ в GCC 10 [1], и ожидаемой реакции присутствующих здесь представителей разработчика коммерческого статического анализатора PVS-Studio, у меня возник вопрос: «Почему же представители отказываются проверить [2] свой продукт на таких простых примерах для статического анализа, и не скрывают ли они чего?»
Andrey2008 [3] Ды, неинтересно мне это. Поймал/не поймал синтетическую ошибку, это ничего не говорит о возможностях анализатора
Должны же они как то прогонять юнит-тесты своего продукта и как, если не на таких синтетических простых примерах?!
Собственно, пришлось сделать это самому.
Обнаружена с диагностикой:
V586 The 'free' function is called twice for deallocation of the same memory space. Inspect the first argument. Check lines: 5, 6. 1_dbl_free.c 6
Пройден
Непонятная ругань на константу в malloc, но ошибка обнаружена — недоступный код и неиспользованная память:
V118 malloc() function accepts a dangerous expression in the capacity of an argument. 2_longjump.c 13
V779 Unreachable code detected. It is possible that an error is present. 2_longjump.c 15
V799 The 'ptr' variable is not used after memory has been allocated for it. Consider checking the use of this variable. 2_longjump.c 13
Пройден
Обнаружены:
V118 malloc() function accepts a dangerous expression in the capacity of an argument. 3_fopen.c 7
V773 Visibility scope of the 'f' file handle was exited without closing the file. A resource leak is possible. 3_fopen.c 9
V773 Visibility scope of the 'p' pointer was exited without releasing the memory. A memory leak is possible. 3_fopen.c 9
V799 The 'p' variable is not used after memory has been allocated for it. Consider checking the use of this variable. 3_fopen.c 7
Пройден
Баг обнаружен:
V774 The 'n' pointer was used after the memory was released. 4_use_after_free.c 9
V591 Non-void function should return a value. 4_use_after_free.c 11
Пройден
Выданы предупреждения, не относящиеся к ошибке:
V104 Implicit conversion of 'n' to memsize type in an arithmetic expression: sizeof (int) * n 5_free_nonheap.c 11
V799 The 'ptr' variable is not used after memory has been allocated for it. Consider checking the use of this variable. 5_free_nonheap.c 11
Провален
Провален
Хотя это настолько специфическая диагностика, что я бы не ставил ее в укор.
Далее я прошелся по перечню диагностик в GCC 10 [4] и дописал примеры, потому дальнейшие тесты с исходниками.
PVS не обнаружил этих ошибок
GCC 10 обнаружил double-fclose но не обнаружил free для закрытого хендла.
#include <stdlib.h>
void closefile(FILE* f) {
fclose(f);
}
void test(const char *filename) {
FILE *f = fopen(filename, "r");
void *p = malloc(1024);
/* do stuff */
closefile(f);
fclose(f);
free (p);
free(f); // <- UB
}
Провален
PVS не заметил ничего, GCC10 отработал верно
#include <setjmp.h>
#include <stdlib.h>
static jmp_buf env;
static int i;
static void inner(void) {
longjmp(env, 1);
}
static void middle(void) {
inner();
}
void outer(void) {
i = setjmp(env);
}
void outer_x2(void) {
outer();
if (i == 0)
middle();
}
Провален
Провален обоими участниками, хотя в простых случаях GCC обнаруживает такое, но это еще не функция -fanalyzer (а может еще не реализована).
#include<stdlib.h>
struct str1 {
char buf[10];
};
struct str1 * ret(int sel)
{
struct str1 var1, *pval;
if(sel == 1)
pval = &var1;
else if(sel != 1)
pval = (struct str1 *)malloc(1000);
return pval;
}
Провален
Похоже, еще не работают в GCC10 -fanalyzer.
PVS такое отлавливает, как много раз уже демонстрировалось.
Пройден
Статический анализ в PVS-Studio определенно есть.
Хотя и не без некоторых недостатков, но и им стоит пользоваться, тем более, что будут обнаружены и многие человеческие ошибки, не только из области статического анализа.
Автор: Siemargl
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/static-code-analysis/352247
Ссылки в тексте:
[1] Статический анализ в GCC 10: https://habr.com/ru/post/496278/
[2] отказываются проверить: https://habr.com/ru/post/496278/#comment_21508186
[3] Andrey2008: https://habr.com/ru/users/andrey2008/
[4] перечню диагностик в GCC 10: https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html
[5] Источник: https://habr.com/ru/post/497810/?utm_source=habrahabr&utm_medium=rss&utm_campaign=497810
Нажмите здесь для печати.