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

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

![0350_PVS-Studio_CSharp_ru/image1.png](https://import.viva64.com/docx/blog/0350_PVS-Studio_CSharp_ru/image1.png)

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

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

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

Сегодня мы услышали первый крик новорожденного\. Мы адаптировали нашу любимую диагностику V501 для C\#\. На её счету много славных [находок](https://pvs-studio.ru/ru/blog/examples/v501/)\. И вот есть самый первый результат\. Запустив PVS\-Studio на проекте MSBuild, мы нашли в нём первую ошибку:

```cpp
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'\. Правильный вариант:

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

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

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

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

Скорее всего прозвучат вопросы, на какой технологии будет построен анализатор\. Отвечаю\. Мы используем [Roslyn](https://github.com/dotnet/roslyn)\.

Большое спасибо за внимание\. **C\# программистам, которые не знают, что такое PVS\-Studio и на что он способен, предлагаю посетить вот этот [раздел](https://pvs-studio.ru/ru/blog/inspections/)\.** Уверен, он вас впечатлит, и вы захотите поскорее испытать PVS\-Studio на своих C\# проектах\.