Sonar. C# и PVS- Studio / Блог компании PVS- Studio / Хабрахабр В ноябре прошлого года в нашем блоге была опубликована статья о разработке и использовании плагина PVS- Studio для Sonar. Qube. Мы получили много откликов от клиентов и просто заинтересованных пользователей с просьбами провести тестирование плагина на реальном проекте. Так как интерес к этому вопросу не ослабевает, было решено провести тестирование на C# проекте Pascal. ABC. NET. Также не будем забывать, что Sonar. Qube содержит собственный статический анализатор C# кода — Sonar. C#. Для полноты картины проведем исследование и Sonar. C#. Целью данной работы является не сравнение анализаторов, а показ основных особенностей их взаимодействия с сервисом Sonar. Qube. Прямое сравнение анализаторов было бы не вполне корректным по той причине, что PVS- Studio является специализированным инструментом поиска ошибок и потенциальных уязвимостей, в то время как Sonar. Qube — это сервис оценки качества кода по большому числу параметров: дублирование кода, соблюдение стандартов кодирования, покрытие кода модульными тестами, возможные ошибки в коде, плотность комментариев в коде, технический долг и т. Введение. Предварительно рекомендую ознакомиться с материалами статьи, где мы рассказываем о платформе Sonar. Qube и интеграции с ней анализатора PVS- Studio. Теперь немного об исследуемом проекте. Pascal. ABC. NET — это реализация языка программирования Pascal нового поколения, содержащая собственную среду разработки, а также Web- среду для создания программ на языках Pascal. ABC. NET, C#, Visual Basic. Не Удается Инициализировать Среду Visual Basic Word 2010 Windows 10Р’ C#, Visual Basic Рё F# Р. Вот такая вот проблема: При закрытии ворда (и любого другого офис-приложения) перед самим пропаданием окна появляется ошибка -. NET, F#, Iron. Python. Проект разработан на языке C# и распространяется под свободной лицензией LGPLv. Исходный код можно загрузить из репозитория на Git. Hub. Решение Pascal. ABC. NET включает 2. Source. Monitor). Таким образом, проект имеет вполне подходящий размер для наших исследовательских целей. Sonar. C#. Как уже говорилось ранее, сервис Sonar. Qube имеет в своем составе, в том числе, статический анализатор C# кода. Чтобы, как в нашем случае, добавить открытый проект на сайт, а также произвести его анализ, достаточно нескольких несложных действий. Для регистрации на сайте Sonar. Qube я использовал учетную запись Git. Hub. Далее воспользовался инструкцией по быстрому старту. Весь процесс настройки, включая привязку проекта Pascal. ABC. NET к аккаунту, получение уникального ключа организации и настройку на локальном компьютере, занял у меня около 1. Еще 1. 0 минут ушло на анализ проекта. После этого результат был загружен на сайт Sonar. Qube, с ним может ознакомиться любой желающий. Sonar. Qube выдал 3. Неожиданно перестал работать Word 2000: - при запуске возникает заставка 'Не удается инициализировать среду Visual Basic', - при отрытии документа заставка повторяется, с документом работать нельзя (ни сохранить, ни изменить). Не удается изменить свойства объектов CodeModel. Большинство свойств в CodeModel2 реализуются как поля для проектов Visual Basic, доступные только для чтения. Перестал работать Word 2000: - при запуске возникает заставка 'Не удается инициализировать среду Visual Basic', - при отрытии документа заставка повторяется, с документом работать нельзя (ни сохранить, ни изменить). Почему вылезает ошибка 'не удается инициализировать среду visual basic', когда копируешь таблицу с параметром 'сохранить только текст' в wordе 2010? Pascal. ABC. NET. Из них: 8 блокирующих (требуют немедленного устранения), 6. Информационных сообщений выдано не было. Давайте попробуем ознакомиться с полученными предупреждениями, найти интересные ошибки и понять, каков процент ложных срабатываний. Для этого воспользуемся удобными средствами фильтрации в различных измерениях, предоставляемыми сервисом Sonar. Qube. Начнем с блокирующих предупреждений. Blocker. Как видим, блокирующие предупреждения выданы для двух правил: бесконечная рекурсия и очистка IDisposable- ресурсов. Вот пример одного из blocker- предупреждений. В get- секции свойства Instance ошибочно возвращается Instance, вместо instance, что порождает бесконечную рекурсию. Все остальные предупреждения на уровне Blocker также являются ошибками. Critical. На уровне Critical было выдано 6. Рассмотрим одно из таких предупреждений. Изучив код и список имплементаций, я соглашусь с анализатором: в данный момент действительно нет ни одного типа, реализующего сразу оба интерфейса IBase. Scope и IComparable, вследствие чего результатом проверки box. Item. Item is IComparable всегда будет false. Однако, я бы не стал говорить об ошибке в данном случае, так как, во- первых, само наличие такой проверки исключает последующее возникновение исключения при попытке приведения типа (IComparable)box. Item. Item. Во- вторых, в любой момент к решению может быть подключена, например, некая dll, в которой будет объявлен тип, реализующий оба интерфейса IBase. Scope и IComparable. Возможно, на это и рассчитывал разработчик, реализуя приведение типа только после проверки. Рассмотренное предупреждение, на мой взгляд, следует отнести к разряду сообщений для секции Minor, а не критичных для выполнения, и наличие его на уровне Critical считать ложным срабатыванием. Оставшиеся 6. 3 предупреждения аналогичны рассмотренному. Major. На данном уровне было выдано достаточно много предупреждений — 1. Давайте пройдем по списку предупреждений с целью поиска реальных ошибок и оценки возможностей анализатора. General exceptions should never be thrown. Правило сообщает о выбросе исключения общего типа при помощи throw. В коде проекта Pascal. ABC. NET было найдено 6. Подавляющее большинство имеет следующий вид. Также встречается очень много (более 6. Конечно, выброс исключений общего типа является «дурным тоном». Тем не менее, как мне кажется, это вовсе не ошибки. Тем более маловероятно, чтобы авторы кода умышленно наплодили их в таком количестве. Да, обработка исключений в проекте Pascal. ABC. NET, по всей видимости, не на высоте. Тем не менее, место всем этим 6. Minor или вовсе в ложных срабатываниях анализатора. Кстати, это хороший пример, в чем разница между Sonar. C# и анализатором PVS- Studio. Sonar. C# указывает на «запахи» в коде и совершенно прав, выдав эти предупреждения. Они позволяют судить о качестве проекта. С точки же нас, разработчиков анализатора PVS- Studio, это ложные срабатывания, так как мы ориентированы на поиск ошибок и дефектов безопасности. Dead stores should be removed. Также весьма обширная группа из 6. Здесь преобладает следующий паттерн. Переменную инициализируют при объявлении, а затем, ни разу не использовав сохраненное значение, присваивают новое. Конечно, так делать не следует. Тут и вопросы экономии ресурсов, и возможные подозрения на другую ошибку или опечатку. Но фактически — ни одна из таких конструкций ошибкой не является. Вновь непонятно, почему все подобные предупреждения были помещены в секцию ошибок высокой важности? На мой взгляд все это — ложные срабатывания. Есть и несколько абсолютно однозначных false- positive предупреждений вида. Если в данном случае последовать рекомендациям анализатора, то логика работы программы будет нарушена. Таким образом, мне так и не удалось найти среди 6. Floating point numbers should not be tested for equality. Действительно, такие сравнения часто дают ошибочный результат, который связан с особенностями хранения вещественных переменных в памяти и может варьироваться, например, в зависимости от настроек компилятора. Такие конструкции могут очень долгое время работать без проблем. При этом необходимо в каждом конкретном случае принимать решение об ошибочности такого кода. Например, если сравниваемые значения являются результатом математических вычислений, то прямое сравнение этих значений обычно ошибочно. Если же вы производите сравнение двух вещественных констант, то, вероятно, это делается осмысленно и ошибки не будет. В коде Pascal. ABC. NET мне встретился, преимущественно, следующий паттерн сравнения с вещественной переменной. Обратите внимание, что сравнение производится как двух вещественных переменных, так и вещественной переменной с переменной целого типа. Конечно, такой код не вполне безопасен, так как неизвестно, каким образом были получены сравниваемые значения. Стоит ли здесь говорить о явной ошибке? Сложно дать однозначный ответ. Но код, вероятно, требует доработки. Кстати, анализатор PVS- Studio также предупреждает о таких подозрительных сравнениях, но эти диагностики относятся к уровню достоверности Low и не рекомендуются нами к изучению. Также среди выданных анализатором предупреждений есть очевидные ложные срабатывания, например. В данном случае производится сравнение двух переменных типа byte. Переменные left и right имеют тип byte. Однако, я бы не стал считать все найденные предупреждения ошибками. Решение должен принимать автор кода в каждом конкретном случае. Multiline blocks should be enclosed in curly braces. Группа из 1. 08 предупреждений, включающая потенциальные ошибки форматирования, влияющие на логику выполнения программы. Здесь я обнаружил довольно подозрительные конструкции. Пример. В данном фрагменте, возможно, пропущены скобки. В любом случае, разработчику следует отформатировать код для лучшего понимания логики работы программы. Ещё одно подобное предупреждение. Ошибки нет, но код выглядит неаккуратно. Необходим рефакторинг. В принципе, все предупреждения из данной группы выданы по делу, но настоящих ошибок они не выявили. Null pointers should not be dereferenced. В данном блоке я обнаружил интересные ошибки. Действительно, ранее в коде переменная returned. Я бы оценил процент нахождения реальных ошибок здесь равным 8. Очень хороший результат. Conditions should not unconditionally evaluate to «true» or to «false»Блок предупреждений об условиях, которые выполнимы вне зависимости от логики работы программы. Типичная из найденных ошибок. Странный код, требующий доработки автором. Возможно, допущена серьезная ошибка. В целом, группа содержит порядка 7. Exceptions should not be thrown from property getters. Не следует выбрасывать исключения в get- секции свойства, а при необходимости — использовать методы вместо свойств. В данной группе содержится 4. Подавляющее большинство из них — это «заглушки», оставленные разработчиками умышленно или по забывчивости. Есть и не вполне корректные конструкции, требующие рефакторинга. Тем не менее, я не считаю данные предупреждения ошибками. Думаю, рациональней их было- бы отнести к секции Minor. Static fields should not be updated in constructors. Диагностика об опасности обновления статических полей в конструкторах: это может привести к несогласованному поведению программы, так как поле будет заново инициализировано для всех экземпляров класса. Всего для проекта Pascal. ABC. NET анализатор выдал 2. Я не нашёл среди них реальных ошибок. Вот пара примеров обнаруженных фрагментов кода. В статическую переменную . Судя по имени переменной — так и задумывалось. Ничего криминального.
0 Comments
Leave a Reply. |
Details
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |