Аннотация:
В работе рассмотрены различные аспекты статического анализа программ на языке C# с целью обнаружения максимального количества ошибок за минимально приемлемое время. Описан полный цикл статического анализа программного обеспечения, при этом основное внимание уделяется особенностям, возникающим при анализе языка C#. Рассмотрены методы, позволяющие учитывать популярные возможности языка на всех уровнях анализа: построение графа вызовов и графа потока управления, проведение анализа потоков данных и чувствительного к контексту и путям межпроцедурного анализа. Предлагается метод символьного исполнения, основанный на таких работах, как Bounded Model Checking и Saturn Software Analysis Project. В статье описана организация модели памяти, позволяющая как проводить точный внутрипроцедурный анализ, так и создавать компактные представления для привязанных к функциям условий, используемые при межпроцедурном анализе. Особое внимание уделяется теме оптимизации возникающих на этапе чувствительного к путям анализа условий. Условия необходимо оптимизировать как по размеру, поскольку при межпроцедурном чувствительном к путям анализе необходимо сохранять большое количество условий для каждой проанализированной функции, так и по сложности, поскольку время анализа ограничено. Решение условий производится при помощи современных SMT-решателей, таких как Microsoft Z3 Prover. В статье также рассмотрены различные подходы к моделированию поведения библиотечных функций: при помощи резюме в виде набора признаком или в виде упрощенных реализаций на языке C#. Все приведённые решения реализованы в инструменте статического анализа SharpChecker и протестированы на наборе проектов различного объема (от 1.5 тыс. до 1.35 млн. строк кода) с открытым исходным кодом.
Ключевые слова:
Roslyn, C#, статический анализ, использование нулевого указателя, чувствительность к путям, чувствительность к контексту, резюме функции, поиск дефектов.
Реферативные базы данных:
Тип публикации:
Статья
Образец цитирования:
В. К. Кошелев, В. Н. Игнатьев, А. И. Борзилов, “Инфраструктура статического анализа программ на языке C#”, Труды ИСП РАН, 28:1 (2016), 21–40
\RBibitem{KosIgnBor16}
\by В.~К.~Кошелев, В.~Н.~Игнатьев, А.~И.~Борзилов
\paper Инфраструктура статического анализа программ на языке C\#
\jour Труды ИСП РАН
\yr 2016
\vol 28
\issue 1
\pages 21--40
\mathnet{http://mi.mathnet.ru/tisp2}
\crossref{https://doi.org/10.15514/ISPRAS-2016-28(1)-2}
\elib{https://elibrary.ru/item.asp?id=26166300}