The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..., opennews (ok), 14-Дек-17, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


67. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от anonymous (??), 14-Дек-17, 19:47 
Но чтобы не быть голословным, вот один пример ложного срабатывания, который мозолил глаза больше всего:
warn V779 Unreachable code detected. It is possible that an error is present.

Это он выдаёт на функцию с названием abort(), реализованную в классе. Отличий от abort() и ::abort() анализатор различить не в состоянии.

Ответить | Правка | К родителю #65 | Наверх | Cообщить модератору

70. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Andrey_Karpov (ok), 14-Дек-17, 20:47 
Отличать он функции умеет. Но есть ряд функций, с "волшебными" именами, которые анализатор интерпретирует независимо в каком классе или namespace они находятся. К ним относится и функции с именем "assert". По нашей статистике в 95% случав, эти функции прекращают выполнение программы. Это или просто синоним стандартного abort или какая-то функция, которая что-то делает (например, пишет в лог), а уже потом останавливает программу. А раз так, значит надо реагировать на любую функцию abort, как прекращающую выполнение. Лучше угодить 95% разработчикам, чем не угодить 5% разработчиков. Что делать, вот такой он статический анализ.
Ответить | Правка | Наверх | Cообщить модератору

78. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +1 +/
Сообщение от Orduemail (ok), 15-Дек-17, 01:22 
А проверить любую функцию с именем abort на предмет того, не является ли она no-return, как abort? PVS-Studio ведь анализирует как-то control flow, почему бы не сделать шаг дальше, не нарисовать полный call-graph и не проверить нет ли там внутри безусловного вызова abort, или exit, или ещё чего-нибудь в этом роде.

Кстати, gcc ведь позволяет вешать атрибут на функцию, чтобы отметить именно такое поведение (не помню как называется, может no-return). Почему бы не положиться на этот атрибут, для определения того, что функция не возвращает управление обратно? abort/exit из стандартной библиотеки, на них должен висеть этот атрибут в хидерах. И можно выдавать программисту предупреждение, если найдена no-return функция, на которой не висит этого атрибута. Или в C++ нет этих атрибутов? А, или вы на всякие не-gcc-компиляторы ориентируетесь, которые не умеют в атрибуты?

Ответить | Правка | Наверх | Cообщить модератору

92. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Andrey_Karpov (ok), 15-Дек-17, 09:42 
Всё верно говорите. Анализатор по возможности заглядывает в функции и учитывает атрибуты no-return.  Но без межмодульного анализа (он пока только в планах) не всегда возможно проследить цепочку вызовов и понять, закончится всё завершением программы или нет. Впрочем, и межмодульный анализ не всегда поможет, так как отслеживать цепочки сложно, особенно когда они ветвятся при разных условиях. На аннотации тоже особенно надеяться не приходится. Просто мало кто их пишет, поэтому отсутствие у функции атрибута no-return ничего не означает.

Ответить | Правка | Наверх | Cообщить модератору

99. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Orduemail (ok), 15-Дек-17, 17:51 
Конкретно с этим случаем ведь не нужен никакой особый межмодульный анализ. Достаточно повесить атрибут на функцию. Это может сделать автор кода или статический анализатор. Причём последний может это делать даже не правкой сорцов, а правкой своей собственной базы тегов, которую можно хранить в формате типа расщиренного ctags/etags (единственное, что анализатор от этого станет двупроходным). Вероятно, можно и другие атрибуты хранить, типа non-null, для функции возвращающей гарантированно не нулевой указатель. Или что-нибудь о том, как функция обходится с переданными ей указателями -- может быть она на них free вызывает, или, скажем, сохраняет в какой-нибудь структуре данных со временем жизни большим, чем время жизни стекового фрейма этой функции. Или функция полагается на то, что переданные ей аргументы не нули. А может быть она функция хорошая, и пользуется указателями не создавая никаких экзистенциальных рисков.

То есть, таким образом, статический анализатор, де факто, расширит систему типов языка, привнесёт в неё то, что ему удобно, причём не вынося этими вопросами мозги клиенту, потому что тот не будет сталкиваться с этой расширенной системой типов, он будет иметь дело с варнингами анализатора, которые вылезут из нарушений правил скрытой от него системы типов. А прошаренный клиент может освоить эту скрытую систему типов, и начать расставлять атрибуты типов специально оформленными комментариями.

И тут ведь открываются любопытные перспективы. Начиная от того, что исследования того, как создать такую систему типов может быть полезным для развития разработчиков PVS-Studio, что само по себе даст конкуретное преимущество, и заканчивая тем, что если это исследование не сведётся к чтению уже существующих исследований возможностей типизации, но найдёт что-то своё, то эти находки можно оформить в виде статей, а через это, можно, например, кандидатскую защитить, PhD получить, или просто впихнуть упоминание PVS-Studio в computer science статью, которую будут читать все, кто в теме.

Я это не к тому излагаю, чтобы "научить как надо писать статические анализаторы" -- не, мне просто самому интересно, насколько точно моё видение перспектив отражает реальность.

Ответить | Правка | Наверх | Cообщить модератору

101. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Andrey_Karpov (ok), 15-Дек-17, 19:15 
То, про что вы говорите, мы называем базой разметки функций. Про это я писал в статье "Как PVS-Studio ищет ошибки: методики и технологии": https://habrahabr.ru/company/pvs-studio/blog/319382/ (см. раздел Method annotations). Анализатор черпает информацию из этой базы, или пытается сам создать информацию о функции, изучив её тело, или берет некоторую информацию, основываясь на атрибутах функций, таких как __declspec() / __attribute__(()) / [[attribute]] и наконец, следуя особым комментариям пользователей (см. например. "Дополнительные возможности" в описании диагностики V576 https://www.viva64.com/ru/w/v576/ ).

Делается большая работа, но не смотря на не часто анализатор по-прежнему слеп и ему остаётся руководствуется "чутьем", как в рассматриваемом случае.

Ответить | Правка | Наверх | Cообщить модератору

103. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  –1 +/
Сообщение от anonymous (??), 15-Дек-17, 19:44 
> А проверить любую функцию с именем abort на предмет того, не является ли она no-return, как abort?

Уже давно есть. Почему-то тот же QtCreator спокойно переходит на неё по F2, а не лезет в недра stdlib.h

Ответить | Правка | К родителю #78 | Наверх | Cообщить модератору

105. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Orduemail (ok), 15-Дек-17, 20:01 
>> А проверить любую функцию с именем abort на предмет того, не является ли она no-return, как abort?
> Уже давно есть. Почему-то тот же QtCreator спокойно переходит на неё по
> F2, а не лезет в недра stdlib.h

F2 -- это "сохранить файл"? Какое это отношение имеет к "проанализировать функцию на предмет, возвращает ли она управление или нет"?

Ответить | Правка | Наверх | Cообщить модератору

102. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от anonymous (??), 15-Дек-17, 19:40 
Это частный пример. Если для каждого ошибочного срабатывания набирать по 5%, то тогда ой. Как-то сложно пытаться потом вытащить из сотни ложных срабатываний реальные ошибки. И заметим, ценник на продукт весьма хорош.
Ответить | Правка | К родителю #70 | Наверх | Cообщить модератору

104. "Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."  +/
Сообщение от Andrey_Karpov (ok), 15-Дек-17, 19:47 
Анализатор PVS-Studio часто требует настройки. Как и любой другой анализатор. После настройки количество ложных срабатываний становится низким и с ними можно точечно бороться комментариями или изменением кода. Пример: Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний - https://www.viva64.com/ru/b/0523/

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру