Почему компиляция должна участвовать в процессе проверки кода?

Эта статья опубликована сообществом Huawei Cloud  «Почему компиляция должна участвовать в процессе проверки кода?» , автор:gent_zhou.

Поскольку все уделяют все больше и больше внимания безопасности программного обеспечения, защита безопасности исходного кода на этапе кодирования также все чаще упоминается группами исследований и разработок, тестирования, эксплуатации и обслуживания, а также отдельными разработчиками предприятий из всех слоев общества, в том числе особенно выделяется инструмент SAST для статической проверки кода.

Служба проверки кода SAST — это инструмент, который может проверять качество (включая стиль), безопасность, спецификации и другие аспекты исходного кода. Он может обнаруживать дефекты и риски в коде. Поскольку все используют инструмент глубоко, многие друзья в процессе использования приходят в замешательство: разве они не согласились только проверять исходный код? Зачем нужна компиляция? Почему в моей локальной среде компиляция проходит успешно, но когда я помещаю ее в облачную среду, пишет, что компиляция не удалась?

В этой статье делается попытка объяснить вышеуказанные вопросы один за другим, чтобы друзья могли понять процесс и принципы.

1. Разве вы не согласились проверять только исходный код? Зачем нужна компиляция?

Вообще говоря, да, статическая проверка кода SAST — это технология статического тестирования безопасности приложений, которая обычно выполняется до компиляции кода; то есть инструмент SAST не вызывает принудительное выполнение или запуск кода до того, как его можно будет использовать. , Он нацелен на сам исходный код. Вы можете проанализировать синтаксис, структуру, логику и т. д. кода.

Однако это не означает, что инструмент SAST не имеет ничего общего с компиляцией; на самом деле, при необходимости инструмент SAST также должен использовать инструмент компиляции и построения для компиляции кода, а затем анализировать сгенерированный продукт компиляции для анализа семантика кода и логика для более глубокого понимания и анализа.

2. Каков общий процесс компиляции?

Прежде чем говорить о процессе компиляции, давайте сначала разберемся с некоторыми существительными собственными.

AST, абстрактное синтаксическое дерево, представляет собой древовидную структуру данных, используемую для представления структуры программного кода.Она может отражать синтаксис и логику кода. AST можно использовать для проверки синтаксиса, проверки стиля кода, форматированного кода, подсветки синтаксиса, подсказок об ошибках, автоматического завершения и т. д.

cke_114.png

IR, Intermediate Representation, — это структура данных, используемая для представления семантики программного кода. Она может преобразовывать коды на разных языках программирования в общую форму для облегчения анализа и оптимизации.

cke_115.png

CFG, «График потока управления», представляет собой графическую структуру данных, используемую для представления потока выполнения программного кода. Она может разделить код на базовые блоки и использовать края для представления связей перехода между базовыми блоками.

cke_116.png

Вышеупомянутые три технических существительных помогают инструментам лучше понимать и обрабатывать семантику и логику кода в процессе проверки кода, помогая повысить точность анализа.

Давайте вернемся к сути: какие процессы мы пройдем в процессе компиляции инструмента проверки кода SAST? Вообще говоря, будет проходить полный процесс компиляции: анализ исходного кода на синтаксис, лексику и семантику, генерация AST, затем преобразование в IR, генерация CFG, анализ и оптимизация потока данных и генерация целевого кода.

Таким образом, проверка кода SAST не является полностью независимой от компиляции.В определенной степени для проведения углубленного анализа необходимо полагаться на инструменты компиляции и построения.

3. Почему компиляция завершается успешно в моей локальной среде, но завершается неудачей, когда я помещаю ее в облачную среду?

На этом этапе, я думаю, большинство друзей поймут, что в инструменте SAST используется операция компиляции, но я полагаю, что сцены неудачного сканирования во время использования все равно будут. Наиболее типичной должна быть проблема в подзаголовке: Почему моя локальная компиляция прошла успешно, но когда я проверяю ее в облачной среде, она говорит, что компиляция не удалась?

В частности, причины примерно следующие:

  • Чаще всего в локальной среде проект ссылается на некоторые частные зависимости или конфигурации, хранящиеся локально. В облачной среде в процессе компиляции SAST эти зависимости или конфигурации не удается найти, и компиляция завершается с ошибкой.
  • Сам проект пользователя не является скомпилированным проектом, или, хотя проект является скомпилированным, он неправильно настроен в проекте. Например, часто встречающаяся проблема заключается в том, что пользователи просто берут на себя управление проектом и получают информацию о том, что это скомпилированный проект, но на самом деле проект не содержит основного файла конфигурации.Например, основной файл конфигурации pom.xml имеет вид отсутствует в проекте MAF.
  • Параметры компиляции проверки в облачном инструменте SAST выбраны неправильно. Например, проект пользователя является проектом Maven, но пользователь ошибочно думает, что это проект gradle, и выбирает gradle в качестве инструмента компиляции в облаке. Другой пример: в проекте C# для проекта компиляции msbuild была выбрана неправильная версия .net framework (была выбрана 3.5 вместо 4.8).
  • В коде пользовательского проекта имеются некоторые грамматические ошибки или ошибки типа (например, орфографические ошибки, отсутствие точек с запятой, несоответствие типов и т. д.) В локальной среде справка IDE автоматически исправляет их или локальный компилятор не проверяет их. Облачный инструмент SAST использует более строгий компилятор или компилятор более высокого уровня, что приводит к сбою компиляции.
  • В проекте пользователя есть некоторые специальные языковые функции или синтаксический сахар, такие как лямбда-выражения, понимание списков и т. д. Локальный компилятор поддерживает эти функции, тогда как облачный инструмент SAST использует компилятор, который не поддерживает эти функции, или версию на более низком языке. Вызывает сбой компиляции.

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

Рекомендации

1. https://en.wikipedia.org/wiki/Abstract_syntax_tree .

2、https://www.twilio.com/blog/abstract-syntax-trees

3、https://www.cs.princeton.edu/courses/archive/spr03/cs320/notes/IR-trans1.pdf .

4、https://gcc.gnu.org/onlinedocs/gccint/Control-Flow.html#: ~:text=График потока управления (CFG) — это данные, поведение функции, которая компилируется.

5、https://www.csl.cornell.edu/ ~zhiruz/5997/pdf/lecture04.pdf

 

Нажмите, чтобы подписаться и узнать о новых технологиях Huawei Cloud как можно скорее~

 

Оштрафован на 200 юаней и конфисковано более 1 миллиона юаней Ю Юйси: важность высококачественных китайских документов Жесткий сервер миграции Маска Solon для JDK 21, виртуальные потоки невероятны! ! ! Контроль перегрузки TCP спасает Интернет Flutter для OpenHarmony уже здесь Срок LTS ядра Linux будет восстановлен с 6 до 2 лет Go 1.22 исправит ошибку переменной цикла for Svelte построила «новое колесо» — руны Google отмечает свое 25-летие
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/4526289/blog/10114610