URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 113028
[ Назад ]

Исходное сообщение
"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."

Отправлено opennews , 14-Дек-17 13:42 
Компания СиПроВер опубликовала (https://www.viva64.com/ru/b/0542/) результаты сравнения качества кода СУБД Firebird, MySQL и PostgreSQL, проведённого по результатам проверки при помощи  продукта PVS-Studio (http://www.viva64.com/ru/pvs-studio/), позволяющего выявить ошибки, дефекты и потенциальные уязвимости на основе статического анализа кода.


Если рассматривать все выданные анализатором предупреждения, то результат проверки выглядит следующим образом:


СУБД


Высокий уровень достоверности предупреждений


Средний уровень достоверности


Низкий уровень достоверности


Всего


Firebird


156


680


1045


1881


MySQL


902


1448


2925


5275


PostgreSQL


611


1432


1576


3619

Чтобы исключить предупреждения в автоматически сгенерированном коде и в сторонних компонентах было решено не сравнивать число выявленных предупреждений  по отношению к количеству строк кода, а провести выборочный ручной разбор логов проверки, попытавшись найти в них заслуживающие внимания ошибки, попутно посмотрев, встречаются ли данные типы проблем в остальных проектах. Кроме того, авторы исследования попытались найти в коде типовые ошибки, которые потенциально могут привести к появлению уязвимостей.

При рассмотрении числа предупреждений по отношению к количеству строк кода, Firebird и PostgreSQL показали примерно одинаковые результаты (у PostgreSQL много предупреждений в автосгенерированном коде). В  MySQL число предупреждений немного выше, но не существенно. Другая ситуация наблюдается при попытке ручной проверки типовых предупреждений. Например, MySQL  присвоено 3 штрафных балла за
проблемы затирания приватных данных, 1 штрафной балл за отсутствие проверки валидности указателя, возвращаемого malloc, 3 штрафных балла за использование потенциально нулевого указателя, 2 балла за подозрительное использование элементов перечислений, 2 балла за неверное вычисление размера блока памяти и 2 балла за пропущенное ключевое слово throw.


В свою очередь, PostgreSQL получил лишь 3  штрафных балла за использование потенциально нулевого указателя, а  Firebird получил 1 штрафной балл за подозрительное использование элементов перечислений, 2 балла за вызов неверного оператора освобождения памяти и 1  балл за использование потенциально нулевого указателя. В итоге, меньше всего штрафных баллов получил PostgreSQL - 3, на втором месте Firebird - 4 и худший результат показал MySQL - 13 штрафных баллов.


С учётом того, что в PostgreSQL выявлено достаточно много предупреждений в автосгенерированном коде, а отрыв в один бал от Firebird вызван проблемой среднего уровня достоверности, решено поделить первое место между PostgreSQL и Firebird.

URL: https://www.viva64.com/ru/b/0542/
Новость: https://www.opennet.ru/opennews/art.shtml?num=47740


Содержание

Сообщения в этом обсуждении
"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Дуплик , 14-Дек-17 13:42 
Оно и понятно, MySQL та ещё дрянь. Не зря только KDE'шники её в составе своей DE тянут.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 14:17 
О как, MySQL уже включили в состав KDE Applications! Закнчивай уже грибы жрать.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено виндотролль , 14-Дек-17 18:01 
MariaDB, но суть та же


[~]$ pacman -Si akonadi
Repository      : extra
Name            : akonadi
Version         : 17.08.3-3
Description     : PIM layer, which provides an asynchronous API to access all kind of PIM data
Architecture    : x86_64
URL             : https://community.kde.org/KDE_PIM/Akonadi
Licenses        : LGPL
Groups          : None
Provides        : akonadi-client
Depends On      : kio  kitemmodels  mariadb  hicolor-icon-theme
Optional Deps   : postgresql: PostgreSQL backend
Conflicts With  : akonadi-client
Replaces        : akonadi-client
Download Size   : 2.30 MiB
Installed Size  : 9.75 MiB
Packager        : Antonio Rojas <arojas@archlinux.org>
Build Date      : Thu 07 Dec 2017 06:41:09 AM EST
Validated By    : MD5 Sum  SHA-256 Sum  Signature


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 22:33 
> MariaDB, но суть та же
>
 
> [~]$ pacman -Si akonadi


pkg options akonadi        
akonadi - MYSQL: off
akonadi - PGSQL: off
akonadi - SQLITE: on


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 15-Дек-17 08:42 
Глюкавенько работает. Раньше тоже юзал sqlite, сейчас переключился на mariadb. Они, кстати, честно предупреждают об этом у себя на сайте, типа "мы пыталися, но нишмогли".

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено MBG , 15-Дек-17 21:30 
А в переписке девелоперы аконади говорили, что не пытались... и от помощи отказались, я предлагал. Два студента из Пакистана (если правильно помню) сделали проект и оно работает - уже молодцы, а вот кто решил это как есть тащить в КДЕ - успешные менеджеры, видимо.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 15:12 
Зачем эти люди тестировали MySQL, когда есть Percona? MySQL давно никому не нужен (разве что пацанам из PVS студио), MySQL мертв, его засосала корпоративная трясина.

Кроме того в тесте не хватает SQlite.


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Fantomas , 14-Дек-17 17:45 
В Постгре только сейчас появилась нормальная репликация и то только мастер-слейв.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 18:46 
Юзаю потоковую репликацию уже х.з. мколько лет.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Вареник , 14-Дек-17 21:22 
"Только сейчас" появились полноценные конфигурации кластера.
Несколько лет как появились выборочные репликации (с анализом потока и фильтрами(.

А просто горячая репликация мастер-реплики - лет 15 точно есть. Версии так с 7-й.


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 21:27 
В постгрес нормальная репликация появилась давно, по сути в 8.0 уже был Warm standby.
8.0 (2005): Point-in-time recovery
8.2 (2006): Warm standby
9.0 (2010): Hot Standby
9.1 (2011): Synchronous Replication
9.4 (2014): Slots, Logical decode
9.6 (2016): Multiple sync standby, Remote apply
10 (2017): Logical replication, Quorum commit

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Андрей , 14-Дек-17 21:58 
А толку от бажного функционала?

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 13:44 
> ...решено поделить первое место между PostgreSQL и Firebird.

а MySQL в этом случае остаётся на третьем месте? или автоматически занимает освободившееся второе? автор, прошу -- допиши концовку, этож самое главное!


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey Mitrofanov , 14-Дек-17 13:48 
>> ...решено поделить первое место между PostgreSQL и Firebird.
> а MySQL в этом случае остаётся на третьем месте? или автоматически занимает
> освободившееся второе? автор, прошу -- допиши концовку, этож самое главное!

Не главное -- это, где посадки, пожизненные дисквалификации, лишения флага и звёзды на спину!?


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено commiethebeastie , 14-Дек-17 14:11 
Сравнили firebird и postgres, у моего hello world`а еще меньше ошибок.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено A.Stahl , 14-Дек-17 14:32 
Так ведь цель не в сравнении, а в рекламе...

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 15:54 
> Сравнили firebird и postgres, у моего hello world`а еще меньше ошибок.

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


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено commiethebeastie , 14-Дек-17 16:44 
Издеваетесь? В огнептице даже репликации нет.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено анон , 14-Дек-17 17:30 
действительно, такая мелочь и отсутствует.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 14-Дек-17 17:54 
Как будто в постгресе есть нормальная репликация.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Вареник , 14-Дек-17 21:23 
> Как будто в постгресе есть нормальная репликация.

Есть конечно. Полная, выборочная, мастер-мастер.


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 16-Дек-17 18:47 
> В огнептице даже репликации нет.

На самом деле есть, но она не встроенная в движок и потому плохая... что-то типа slony.


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено anonymous , 14-Дек-17 16:43 
Погонял на паре проектов. Ну что я могу сказать? Чуть получше clang-analyzer. Нашёл пару бесполезных условий, ну и кучу ложных срабатываний. Особенно не дружит с дефайнами и тем, что родил bison. Прога может и полезна, но ценник не радует совсем. Как-то слишком много за обычную утилиту.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey_Karpov , 14-Дек-17 19:24 
Предлагаю ради спортивного интереса более подробно поговорить про ложные срабатывания. По практике общения знаю, что иногда выясняется, что некоторые "ложные" предупреждения совсем не ложные. Не будем брать макросы. С ними всё понятно и предупреждения в них отключаются специальными комментариями. Да, требуется определённая настройка анализатора.
Давайте рассмотрим несколько других ложных срабатываний.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено anonymous , 14-Дек-17 19:34 
Я бы рад, но ключик уже того... И да, из спортивного интереса как-то несерьёзно для такого солидного проекта.

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

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


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

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Ordu , 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-компиляторы ориентируетесь, которые не умеют в атрибуты?


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


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

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

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

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


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey_Karpov , 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/ ).

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


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

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


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

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


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено anonymous , 15-Дек-17 19:40 
Это частный пример. Если для каждого ошибочного срабатывания набирать по 5%, то тогда ой. Как-то сложно пытаться потом вытащить из сотни ложных срабатываний реальные ошибки. И заметим, ценник на продукт весьма хорош.

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


"Голосование"
Отправлено Andrey_Karpov , 14-Дек-17 20:50 
Пользуясь случаем, приглашаю всех почитать статью "PVS-Studio 2018: CWE, Java, RPG, macOS, Keil, IAR, MISRA" и принять участие в голосовании: https://habrahabr.ru/company/pvs-studio/blog/344734/

"Голосование"
Отправлено Аноним , 15-Дек-17 10:55 
> Пользуясь случаем

Сколько заплатил опеннету за "случай"?


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено лютый жабист__ , 15-Дек-17 05:24 
По-моему надо было Монгу проверить, у неё рыночная доля 80%, а FireBird видел 1 раз в махровом недоынтырпрайзе.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Гоги , 16-Дек-17 19:56 
Монга - лютая хипстота, хайп из пука. Фиребирд - какой-никакой, а коммерческий движок стандартных реляционных СУБД. Так что нет, тестирование вполне адекватное с серьёзным перевесом FB.

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 15-Дек-17 07:18 
sqlite не включили чтобы сильно не ползорить остальных?

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено лютый жабист__ , 15-Дек-17 07:59 
>sqlite не включили чтобы сильно не ползорить остальных?

Просто эталонный код? На чём основаны Ваши фантазии?


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено пох , 17-Дек-17 23:47 
бгг... но на самом деле в sqlite половина кода - автогенеренная, там пользы от статического анализатора будет мало, а ложных срабатываний дофига.


"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey_Karp0v , 15-Дек-17 11:46 
А что насчёт https://scan.coverity.com/

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey_Karpov , 15-Дек-17 16:36 
Хороший и очень дорогой инструмент. Впрочем, не так уж он и хорош. Иначе, не было бы статей, например, про проверку Clang (который проверяется с помощью Coverity): https://www.viva64.com/ru/b/0108/ , https://www.viva64.com/ru/b/0155/ , https://www.viva64.com/ru/b/0446/

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Аноним , 15-Дек-17 11:46 
мне больше cppcheck нравится

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Casm , 15-Дек-17 12:03 
Для достоверности не хватает анализа кода самого PVS-Studio

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Andrey_Karpov , 15-Дек-17 16:33 
Проверяем исходный код плагина PVS-Studio с помощью PVS-Studio - https://habrahabr.ru/company/pvs-studio/blog/279437/

"Сравнение качества кода Firebird, MySQL и PostgreSQL в анали..."
Отправлено Мирон , 18-Дек-17 06:12 
Всё хорошо, но Постгресс глубокая база. Там по - настоящему знать надо, чтобы толком писать. А на MySQL каждый выпускник тех вуза чет слепит, посчитает расходы ресурсов, и вроде про.

Ну и как - то так получилось, что Multiversion Concurrency Control (MVCC), только недавно "победила". Теперь все пишут MVCC или в стадии конверсии к MVCC.

Наверное чем берёт, это поддержкой Oracle. Всё - таки когда у команды есть такой тыл, это многое решает. Ну и потом их InnoDB конечно встроил поддержку сложных структур с единым интегрированным потоком данных ( один файл/базу, ну или для улучшения скейла можно добавить на отдельные диски ), этого у Постгресса вплоть до версии 8 не видел, а с 9-й времени посмотреть пока не было, как был файл/таблица так и есть. А при многопоточной обработке данных с тысячами таблиц, это конечно распыляет ресурсы машины. Хотя в отличие от например MVCC в этом споре последнее слово пока не сказано.

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