Некоторые пользователи C# анализатора PVS-Studio сталкивались с тем, что этап подготовки проектов либо работает очень долго, либо вообще зависает. В этой заметке мы рассмотрим, как могла проявляться проблема и как мы её починили.
Проблема могла проявляться по-разному в зависимости от того, где используется C# анализатор (Visual Studio, Rider, command line). Типичный признак, как я упоминал выше, – этап подготовки проектов идёт либо очень долго, либо вообще не завершается.
Visual Studio
О зависании свидетельствует следующее окно, в котором прогресс либо не движется, либо движется очень медленно:
Rider
В окне "Background Tasks" выполняется шаг "PVS-Studio: Preparing for analysis", но прогресса нет:
Command-line (PVS-Studio_Cmd.exe / pvs-studio-dotnet)
При запуске консольной версии (PVS-Studio_Cmd.exe для Windows или pvs-studio-dotnet для Linux или macOS) после запуска анализатора нет никакого прогресса (даже при использовании флага '‑‑progress'):
В анализаторе есть код, который разбирает зависимости проектов друг от друга, в том числе транзитивные. И всё бы неплохо, вот только не учитывалось, какие проекты уже были обработаны, какие - нет. В итоге для одного и того же проекта обработка могла запускаться раз за разом, если он часто появлялся в транзитивных зависимостях других проектов.
Допустим, у нас есть 3 проекта: 'A', 'B', 'C'. 'A' зависит от 'B' и 'C', 'B' зависит от 'C', 'C' ни от чего не зависит. В итоге получалась такая логика. При анализе 'C' мы будем обрабатывать 1 проект (сам 'C'), в случае с 'B' - 2 проекта ('B' и 'C'), в случае с 'A' - 4 проекта (сам 'А', 'B' и 'C' как прямые зависимости, 'C' как транзитивную зависимость по проекту 'B'). Понимаете, да, какая последовательность вырисовывается? 1, 2, 4, 8, 16, 32, 64...
В итоге доводилось видеть, как анализатор пытался разобрать сотни тысяч и даже миллионы зависимостей. Если везло, анализатор просто работал долго, если не везло - этап подготовки проекта мог не проходить даже за несколько суток.
Решение оказалось максимально простым - не обрабатываем повторно одни и те же проекты.
Эта простая правка решила проблемы сразу нескольких пользователей:
В таком случае вам нужно просто обновиться до более свежей версии анализатора:
В таком случае вы столкнулись с другой проблемой, о которой мы ещё не знаем. Пожалуйста, напишите нам в поддержку - будем разбираться.
0