>
>
Первый вздох PVS-Studio для C#

Андрей Карпов
Статей: 671

Первый вздох PVS-Studio для C#

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

На данный момент (сентябрь 2015) анализатор PVS-Studio официально поддерживает Visual Studio 2005-2015 и умеет анализировать программы, написанные на C, C++, C++/CLI, C++/CX (WinRT). Также утилита PVS-Studio Standalone позволяет проверять проекты, собираемые не только с помощью Visual C++, но и, например, с помощью MinGW. Есть эксперименты по запуску PVS-Studio на Linux. Однако Linux направление нам не интересно, так как в Linux мире трудно зарабатывать деньги на инструментах для разработчиков. Нашему сердцу ближе Windows, и мы решили порадовать C# разработчиков.

Мы не раз говорили, что код на языке C# менее подвержен ошибкам. В этом языке убраны или изменены многие конструкции, которые позволяют в С++ отстрелить себе ноги как банальными, так и экзотическими способами. Однако от опечаток, ляпов и невнимательности не застрахован никто.

Анализатор PVS-Studio славится своими диагностиками, позволяющими выявлять ошибки, связанные с опечатками, использованием Copy-Paste и так далее. Мы решили перенести свой опыт на C# и создать крайне полезный инструмент.

Сегодня мы услышали первый крик новорожденного. Мы адаптировали нашу любимую диагностику V501 для C#. На её счету много славных находок. И вот есть самый первый результат. Запустив PVS-Studio на проекте MSBuild, мы нашли в нём первую ошибку:

public int Compare(ITaskItem x, ITaskItem y)
{
  if (x.ItemSpec != y.ItemSpec)
  {
    return -1;
  }

  if (x.CloneCustomMetadata().Count !=
      x.CloneCustomMetadata().Count)
  {
    return -1;
  } 
  ....
}

Предупреждение PVS-Studio: V3001 There are identical sub-expressions to the left and to the right of the '!=' operator x.CloneCustomMetadata().Count != x.CloneCustomMetadata().Count. Microsoft.Build.Engine.UnitTests TaskItemComparer.cs 51

Случайно два раза используется переменная 'x'. Правильный вариант:

if (x.CloneCustomMetadata().Count !=
    y.CloneCustomMetadata().Count)

Конечно, что это только один из первых шагов на пути к созданию великого инструмента для C# программистов. Но мы чувствуем желание и силу пройти этот путь.

Мы планируем, что выпустим первую версию C# анализатора к новому году. Конечно к этому времени будут реализованы только некоторые диагностики, позаимствованные из C++ модуля. Однако уже с помощью новогодней версии можно будет найти немало интересных ошибок. Затем постепенно мы реализуем и другие диагностики, которые можно адаптировать для C#. Появятся и специфические диагностики, актуальные только для C# кода.

Примечание. В момент выхода анализатора для C++ & C#, мы планируем отказаться от поддержки Visual Studio 2005, 2008. Их поддержка становится затруднительной по ряду технических и организационных причин.

Скорее всего прозвучат вопросы, на какой технологии будет построен анализатор. Отвечаю. Мы используем Roslyn.

Большое спасибо за внимание. C# программистам, которые не знают, что такое PVS-Studio и на что он способен, предлагаю посетить вот этот раздел. Уверен, он вас впечатлит, и вы захотите поскорее испытать PVS-Studio на своих C# проектах.