Как стать автором
Обновить

Комментарии 88

А анализ C# уже довели до уровня С++? Или C# просто не позволяет так сильно косячить? :)
Из предложений конечно хочется Джаву, на ней же живет весь Энтерпрайз, особенно забугорный. Золотая жила для вас. Но Java как и C# не позволяет очень уж косячить.
А вместо CWE-предупреждений (полезность которых для большинства простых смертных сомнительна) я бы предложил создать класс предупреждений о потенциально тормозных операциях (возможно что-то такое у вас уже есть, просто я не знаю). Т.е. какие-то предупреждения "как не нужно писать код, потому что будет работать медленно".

А анализ C# уже довели до уровня С++? Или C# просто не позволяет так сильно косячить?
К сожалению, нет. C# анализатор слабее C++, хотя-бы в силу совей молодости. Накосячить в C# действительно сложнее, но ошибок всё равно очень много (см. начиная с V3001).

класс предупреждений о потенциально тормозных операциях
Мы называем это микрооптимизации. См. диагностики с номерами 8xx. Их пока немного, но постепенно будем пополнять.

Микрооптимизации — это здОрово, но сэкономить на них получится если они находятся в коде, который вызывается миллионы раз в секунду. А бывает по ошибке сделали в цикле открытие-закрытие файла или еще какую-нибудь ерунду (например, выделение больших кусков памяти, которые потом не используются). Конечно не совсем понятно, как "понять", что подразумевалось на самом деле, но попытаться выявить подобные ситуации можно. Обычно это делается на основе статистики профилирования и оптимизации конкретного проекта — выявляются проблемы, если проблема часто повторяется — придумывают способ, как ее выявлять.

В этом направлении мы и работаем.
например, выделение больших кусков памяти, которые потом не используются
Примеры:
Для java есть множество бесплатных и качественных статических анализаторов кода: в составе sonar, findbug, huntbug и т.п. В чем будет преимущество вашего в количественном и качественном выражении?
findbug мёртв (последняя версия — 6 марта 2015 года).

sonar — использовали в одном из проектов. Не впечатлил.

В общем, есть смысл попробовать.
И да, мы знаем про IntelliJ IDEA…
Вы так и не привели аргументов, сравнения и тп. Смысл пробовать ясен. Скорее вам нужно внедрять то что есть в новые ниши. Просто для java все отлично со статическим код анализом.
Тем более странно слышать такой отзыв о sonar от сотрудника компании, которая получает прибыль за счёт интеграции с сонаром m.habrahabr.ru/company/pvs-studio/blog/315422
huntbugs вполне доступен из maven/gradle/ant.

Для open source проектов удобно использовать в travis CI
about.sonarcloud.io
Для коммерческих — купить платную версию сонара с расширенным возможностями или использовать бесплатную в корпоративной сети.

У меня позитивный опыт использования статического анализатора java кода в Sonar в нескольких организациях
SonarLint, например, молчит на втором примере из статьи:
if (idx1 > 0 && idx2 > 0 &&
    (idx3 < 0 || (idx2 < idx3 && idx3 > 0))) {
    ....
}

На мой взгляд, Data Flow анализ в нем слабый. Явно слабее того, что мы можем предоставить уже сейчас.

Кроме того, механизм аннотаций не развит. Не находятся ошибки такого типа:
int test1(int a, int b)
{
  int x = Math.max(a, a); // <=
  return x + b;
}

String test2(String a)
{
  return a.replace("aaa", "aaa"); // <=
}

Подобные ошибки часто допускают из-за опечаток и упускать их точно не стоит.

При этом, без предварительной настройки, SonarLint уж очень сильно «шумит».
Также, у нас есть ряд уникальных диагностик в C++ и C# анализаторах, которые будут перенесены в анализатор Java.
Короче говоря, конкурентные преимущества будут.
Спасибо за пример! В любом случае с удовольствием почитаю публикацию про новый анализатор! На проектах удобно использовать sonar. Sonarlint при настройке подключения к сонару использует правила и настройки с сервера и не «шумит». continuous code quality дополняется code review и совсем уж ахтунг не должен пройти в эксплуатацию ПО.
if (idx1 > 0 && idx2 > 0 &&
    (idx3 < 0 || (idx2 < idx3 && idx3 > 0))) {
    ....
}

IDEA это умеет =)

HuntBugs тоже таки мёртв. IDEA жива :-)

Ясно( Возможно ли запускать статический анализатор из IntelliJ IDEA community edition без teamcity в travisCI или как анализатор в Sonar?

Теоретически такая возможность существует. Практически потребуется написать некоторый программный код для удобной интеграции. Я не уверен, что его кто-нибудь написал, не изучал этот вопрос (в JetBrains явно этим не занимались).

Есть ли шанс отвязаться от strace?
Целый пласт «linux-подобных» платформ остается за бортом из-за этого.
НЛО прилетело и опубликовало эту надпись здесь
Всего семейства BSD, например.
НЛО прилетело и опубликовало эту надпись здесь
В портах есть, для 32-х битной версии только.
Утилита strace не является основой работы анализатора в Linux, а всего лишь инструмент для одного из режимов запуска. Есть другие способы проверки CMake/QMake проектов, а прямая интеграция анализатора в сборочную систему вообще не имеет ограничений в использовании, т.к. занимает соседнее место с компилятором в системе.

А можно поподробнее о режимх запуска, не требующих strace? Проект CMake.
Конфиг/сборка:
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On <src-tree-root>
make -j8

Анализ:
pvs-studio-analyzer analyze -l /path/to/PVS-Studio.lic
  -o /path/to/project.log -e /path/to/exclude-path -j<N>

Генерация отчёта:
plog-converter -a GA:1,2 -t tasklist
  -o /path/to/project.tasks /path/to/project.log

О всех параметрах анализа и генератора отчётов — тут.

Вообщем сейчас все получилось, непонятно почему не работало раньше. Спасибо!
А для Windows как cmake проекты анализировать?
Все не Visual Studio проекты в Windows проверяются с помощью утилиты Standalone.
А есть возможность делать анализ с помощью json файла, как это приведено в примере выше для linux? Как я понял отслеживание с помощью Standalone не дает 100% срабатывания.
Сам CMake поддерживает JSON Compilation Database для ограниченного списка проектов. В Windows я Вам рекомендую просто сгенерировать проект для Visual Studio и проверить плагином.
Если следовать инструкции с сайта, то вот что я получается:
pvs-studio-analyzer analyze -j2 -o PVS-Studio.log
Error: Couldn't open file strace_out
На вход можно подать как strace_out, так и compile_commands.json. По умолчанию эти два файла ищутся в текущей директории запуска, но вы можете задать другое имя с помощью параметра командной строки.
Спасибо, все работает, это я косячил с правильным запуском cmake…
Если взялись пилить Java, то Kotlin сейчас тоже очень актуален…
Умеет ли PVS-Studio, хоть в каком-то виде, анализировать контекст происходящего в коде?

1. Если ДА, то хотелось бы видеть в Вашем продукте ряд проверок, направленных на анализ многопоточного кода. Абстрактно размышляя, количество объектов и методов синхронизации конечное множество, при этом, довольно, малое. Поиск параллельных участков кода и данных, с которыми имеют дело этот код — задача, достаточно, тривиальная. И при этом, количество диагностик, которые можно было бы написать в этой области достаточно большое (учитывая именно статический анализ кода, естественно, что покрывается не все и поэтому без valgrind и sanitaizer-ов не обойтись). Так же Ваш любимый CWE-362: Race Condition.

2. Так же хотелось бы видеть интеграцию со сборочными решениями уровня Enterprise (как единой точки входа для анализа) и иными IDE (в качестве полноценных плагинов) где это поддерживается, например, CLion/IntelliJ IDEA(в будущем), чтобы не править CMake файлы сборки.

Спасибо.
Касательно пункта 1.

Такие проверки появятся. В конце концов когда-то был неудачный VivaMP. Так что опыт есть. Только теперь мы будем делать не для OpenMP я для распространённых библиотек распараллеливания. Не делаем мы это по той причине, что по-настоящему хорошо всё равно не получится. И пока мы отдаём предпочтение другим направлениям.
Хорошо не получится по той причине, что поиск параллельных ошибок это ооочень сложная задача для статических анализаторов кода. В своё время Intel потратил много сил на разработку статического анализатора для поиска параллельных ошибок. Вы слышали про этот статический анализатор? Вот тот-то и оно, что нет. Не получилось и проект свернули. Если не получилось у Intel, я не уверен, что получится у нас.

Я с Вами соглашусь, и даже скажу, что статически анализом абсолютно невозможно решить целые классы задач в области параллельного кода, однако, мой опыт работы со множеством параллельных математических, научных библиотек и опыт работы с иными библиотеками, где есть какой-то параллельный код показывает, что программисты, зачастую, делают абсолютно простейшие ошибки при написании такого кода, можно даже глубоко не лезть.
Для статического анализа подойдут такие простейшие проверки:
1. Внутри потока все исключения, которые могут произойти должны перехватываться.
2. Явный вызов join() или detach() после порождения потока далее по контексту (STL only).
3. Передача значения по ссылке std::cref() если оно не изменяется в потоке или далее по контексту выполнения.
4. Использование lock_guard() и unique_lock() c объектами синхронизации (не везде).
5. Использование scoped_lock() если надо заблокировать несколько объектов синхронизации.
И т.д.
Статический анализ свое место под солнцем может завоевать.
Не смотрели в сторону Golang? Анализ утечек памяти(горутин)?
Нет.
Java-анализатор взаимодействует с C++ ядром при помощи Java Native Interface (JNI).

Какие задачи будет решать java-часть и почему решили не делать всё на родном для вас C++?

Не всё. Просто механизм Data Flow анализа большой, сложный и есть смысл его переиспользовать.
Для прототипа мы решили использовать дерево и семантическую модель из spoon, т.к это позволяет существенно ускорить разработку.
Поэтому и сами диагностические правила также пишутся на Java.
Логичнее всего конечно Java (вроде один из самых популярных языков), и Objective C (раз уж вы решили таки выйти на MacOS).

Штуки типа RPG кажутся весьма экзотическими, я не уверен что даже здесь есть кто-то, кто встречал это название до прочтения этой статьи. Такое надо под заказ делать… утром деньги вечером стулья, но деньги вперед:)
Не смотрели в сторону нотификаций вида: а вот этот код-то можно в современном стандарте улучшить? Первый претендент — «Вот у этой виртуальной функции можно поставить override, что позволит избежать ошибок в дальнейшем» и т.п.?
Это всё очень размывает функцию поиска ошибок, которую мы считаем основной. Вот, например, можно рекомендовать менять NULL на nullptr. Вроде бы простая, хорошая рекомендация. Но в большом проекте, подобные предупреждения превратят отчёт анализатора в тыкву.
Да, но вы же делаете опциональные варнинги? Как те же микрооптимизации?
Ну и скажем честно, NULL менять на nullptr не так уж и полезно. Я не сталкивался за свою практику с ошибками, которые бы решились такой заменой. В отличие от разъехавшихся сигнатур виртуальных функций, или огроменный бинд на boost, который можно заменить на красивую лямбду.
Я не сталкивался за свою практику с ошибками, которые бы решились такой заменой.

Элементарно:
#include <stdio.h>
void func(void *) { printf("ptr"); }
void func(int) { printf("int"); }
void main()
{
  func(NULL); // WTF?! Why "int", not "ptr"?!
}

Но проблема действительно не сильно частая.
Выглядит как проблема C, где нет ссылкок и модифицируемые переменные любят передавать по указателю. В C++ чаще все-таки передают ссылки, видимо это здорово ограничивает полезность.

Раз уж поддержку джавы планируете, то может и котлин захватите по дороге?
Популярность котлина будет только расти со временем.

Как минимум, я лично, буду очень рад поддержке RPG. В RDi очень не хватает статического анализатора. Да, в RDi 9.6 появились некоторые наметки на простейший рефакторинг, но этого очень мало.
Вот он тот один человек с RPG, держите его, держите!

Проголосовать не могу, плюсую +1

Я хотел бы спросить, а когда будет статический анализатор Erlang?
Про этот язык мы не думали. Не могу ничего сказать.
+1 за RPG. (правда с обязательным условием поддержки разных нотаций 4 и free.)
Не понял про free — поясните, пожалуйста.
Имеется в виду free-form RPG, пример тут.
Фуф, free-form мы знаем, это ладно. А то у меня аллергия на слово free — вот и мерещится всякое.
Тем, что можно забыть закрыть комментарий, и случайно закомментарить код:
/* Comment
Some_Critical_Function();
/* another comment */

Также из-за этого запрещены /* внутри комментариев.

Ну вообще подсветка синтаксиса эти проблемы сразу убирает. Хотя можно предположить ситуацию, когда при мердже двух независимых коммитов в какую-нить vcs получится такая ситуация и подсветку там уже никто не посмотрит.


Сам стараюсь использовать наоборот // чтобы компилировалось с -std=c89

Подумайте над поддержкой Kotlin если делаете поддержку java.
А планируется ли к V2001 и подобным добавить диагностику о использовании анси функций винапи вместо юникодовских?
Уже 9 человек проголосовали за IBM RPG. Я и не рассчитывал на такой ажиотаж. Я конечно надеялся, что статья «найдёт своего читателя». А их уже девять. :)

Прошу откликнуться всех, кто голосовал за RPG. Давайте пообщаемся.
Я думаю это один человек с 9 аккаунтов голосовал :-)
или конкуренты — фокус сбивают ;)
Сделайте бесплатную версию для open-source проектов.
Спасибо, не знал об этом варианте.
А если у меня в проекте в каждом файле вначале идёт информация о лицензии? Могу ли я добавить комментарии после неё, например так?
// Flamingo is an open-source cross platform program for learning languages
// Copyright (C) 2017 Sergey Zakharov
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

Или нужно именно в начале файла перед лицензией?
Комментарии должны быть в начале файла. Для их добавления в автоматическом режиме в той заметке есть ссылка на специальную утилиту.
Доброе. Не знал об варианте. Да, он позволяет использовать бесплатно, но не всем захочется добавлять комментарии в начало каждого файла.
Если не хочется, то предлагаем рассмотреть вариант приобретения лицензии.
Там примерно 600 комментариев об этом.
А поддержку Objective-C (за компанию с macOS) сделать не планируете?
Пока не планируем.
Если нужна помощь с RPG — обращайтесь. 15 лет опыта c AS400 (RPG, CL и все вокруг).
Начинал на RPG || :-).
Только не простое это будет дело, я так думаю.
Фактически, RPG сегодня — это 3 (или даже 4, как считать) разных диалекта.
Я как-то пытался написать синтаксис для VIM и быстро заскучал :-).
Пользователям macOS предлагаю морально подготовиться пробовать проверять свои C, C++ проекты с помощью PVS-Studio :). Ориентировочно PVS-Studio for macOS появится в начале следующего месяца (в апреле 2018).
В 2018 году немного не успели доделать Java анализатор. Но вот и он готов: PVS-Studio для Java.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий