首页 > 其他分享 >代码检查过程中为什么需要涉及到编译呢?

代码检查过程中为什么需要涉及到编译呢?

时间:2023-09-27 14:58:07浏览次数:55  
标签:SAST 检查 代码 编译 工具 云端

本文分享自华为云社区 《代码检查过程中为什么需要涉及到编译呢?》,作者:gentle_zhou。

随着大家对软件安全越来越重视,在编码阶段针对源码安全的保障也被各行各业企业研发测试运维团队与个人开发者越来越频繁的被提及,其中静态代码检查SAST工具尤为突出。

SAST代码检查服务作为一款可以对源码进行质量(包括风格)、安全、规范等方面进行检查的工具,它可以检测出代码中存在的缺陷与风险。而随着大家对工具深入的使用,很多小伙伴在使用过程中产生了困惑,不是说好只针对源码进行检查吗?为什么还会涉及编译?为什么在我本地编译成功,放到云端环境就说编译失败了呢?

本文尝试针对上述这些问题一一进行解释,让小伙伴们了解清楚其中的过程与原理。

1、不是说好只针对源码进行检查吗?为什么还会涉及编译?

一般来说是的,SAST静态代码检查是一种静态应用程序安全测试技术,通常是在代码编译之前进行的;也就是说,SAST工具并不是强制需要执行或运行代码才可以使用,针对源码本身就可以去分析代码的语法、结构、逻辑等。

但是,这并不意味着SAST工具就与编译无关了;事实上,SAST工具在必要的时候,也需要借助编译构建工具来将代码编译之后,对生成的编译产物进行分析,可以对代码的语义和逻辑有更深入的理解和分析。

2、编译的大概过程是怎么样的?

在讲编译的过程前,让我们先了解几个专有名词。

AST,Abstract Syntax Tree 抽象语法树,是一种用来表示程序代码结构的树形数据结构,它可以反映出代码的语法和逻辑。AST可以应用在语法检查、代码风格检查、格式化代码、语法高亮、错误提示、自动补全等方面。

cke_114.png

IR,Intermediate Representation 中间表示,是一种用来表示程序代码语义的数据结构,它可以把不同编程语言的代码转换为一种通用的形式,方便进行分析和优化。

cke_115.png

CFG,Control Flow Graph 控制流图,是一种用来表示程序代码执行流程的图形数据结构,它可以把代码分割为基本块,并用边表示基本块之间的跳转关系。

cke_116.png

上述3个技术侧专有名词,在代码检查过程中,起到了让工具可以更好地理解和处理代码的语义和逻辑的作用,帮助提高分析的准确性。

我们言归正传,那在SAST代码检查工具的编译过程中,都会经历哪些过程呢?一般来说,完整的编译过程会经历:对源代码进行语法、词法、语义的分析,生成AST,接着转换为IR,生成CFG,对数据流进行分析、优化,生成目标代码。

因此,SAST代码检查并不是完全脱离编译,在一定程度上是需要依赖于编译构建工具来辅助深度分析的。

3、为什么在我本地编译成功,放到云端环境就编译失败了呢?

到此,相信大部分小伙伴会对在SAST工具中采用了编译操作表示理解,但是我相信在使用过程中依然会有扫描不成功的场景,其中最典型的必然就是小标题里这个问题了:为什么在我本地编译成功,放到云端环境检查期间就说编译失败了呢?

具体来看,大致有以下几种原因:

  • 最常见的是,在本地环境中,项目中引用了一些存放在本地的私有依赖活配置。而在云端环境,在SAST编译过程中,找不到这些依赖或配置,编译也就失败了。
  • 用户的这个工程项目本身就不是编译类项目 或则 这个项目虽然是编译类项目但在项目中没有做好正确配置。比如经常碰到的问题就是用户刚接手某个项目,得到的信息这就是个编译类项目,但其实在项目中并未含有核心配置文件,比如maven项目中缺少了核心配置文件pom.xml。
  • 云端SAST工具中的检查编译参数没有选择正确。比如用户的工程是个Maven项目,但用户错误以为这是gradle项目,在云端选取了gradle作为编译工具。又比如在C#项目中,针对msbuild编译工程,.net框架选错了版本(3.5选成了4.8)。
  • 用户的项目代码中有一些语法错误或类型错误(比如拼写错误、缺少分号、类型不匹配等),在本地环境中,IDE帮助自动修正或则本地编译器没有检查出来。而云端SAST工具中采用了更严格或更高级别的编译器,导致编译不通过。
  • 用户的工程中有一些特殊的语言特性或语法糖,例如Lambda表达式、列表推导等,本地编译器支持这些特性;而云端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=A control flow graph (CFG) is a data,behavior of a function that is being compiled.

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

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:SAST,检查,代码,编译,工具,云端
From: https://www.cnblogs.com/huaweiyun/p/17732694.html

相关文章

  • 龙芯编译libiconv
    系统版本:4.19.0-loongson-3-desktop loongarch64GNU/Linux 编译renderdoc时报错/usr/bin/ld:找不到-liconv,需手工下载libiconv代码编译:wgethttps://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gztar-zxvflibiconv-1.15.tar.gzcdlibiconv-1.15/./config......
  • PX01如何通过LcdTools读取IC值自动生成初始化代码
    在点屏调试中我们会碰到这种情况,一个已经烧录过全代码的屏在没有获取他的全代码的情况下,怎么从IC里面读取生成初始化代码下到其他屏?LcdTools可以完美解决上述问题,下面举例说明操作过程。首先,我们需要熟悉DriverIC,有哪些寄存器地址,如何进行寄存器读写,我们以ILI9881C为例;ILI988......
  • goland编辑器编译的时候报错package xxx is not in GOROOT的原因排查
    先介绍下,我的目录部署情况1、GOROOT=C:\ProgramFiles\Go(我的golang环境装在c盘的)2、GOPATH=E:\Go(项目目录我放在E盘的)3、GO111MODULE=auto(默认值,没有改过)4、GOVERSION=go1.20.6(我的golang版本)5、项目结构,遵循官方推荐的方式E:\Go——bin——pkg——src 6、本次需要......
  • Visual Studio 2022中粘贴代码会自动变转义字符
    装了VisualStudio2022之后,一直没有正式的项目在跑。最近有新项目,决定试试.net6的新特性。在添加集合时,粘贴”);补充字符串时,发现VS居然自动帮我转了转义字符,比如原文是:varfields=newList<string>();fields.Add("zip我想补充成:fields.Add("zip");结果却变成了:fie......
  • 代码随想录day21 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 2
    530.二叉搜索树的最小绝对差classSolution{private:intresult=INT_MAX;TreeNode*pre=NULL;voidtraversal(TreeNode*cur){if(cur==NULL)return;traversal(cur->left);//左if(pre!=NULL){//中......
  • JVS低代码如何通过逻辑触发变量节点进行表单数据回显?
    使用说明通常业务中会涉及到表单上部分字段填写后通过触发逻辑处理已填写的数据进行回显到表单上,这时我们可以采用业务逻辑来配置对象变量节点进行表单数据回显。对象变量:将自定义字段重新组装新的数据结构,数据结构类型为对象。设计表单入口在表单中配置按钮组件或者是设置组件的网......
  • 携手低代码平台公司,创造高效率办公!
    当前,什么样的平台产品可以实现高效率办公?随着社会化发展程度的推进发展,很多客户朋友希望找到更理想的平台产品,助力企业管理好内部数据,起到链接互通各部门沟通桥梁的作用。低代码开发平台就是其中一种理想的得力助手,可以让企业解放双手,真正让各部门之间的联络和协作关系更和谐,更顺......
  • 面向对象编程的六大原则个人总结(附代码)
    面向对象编程的六大原则个人总结(附代码)目录面向对象编程的六大原则个人总结(附代码)一、什么是单一职责原则?核心思想好处代码示例总结二、什么是里式替换原则?规则代码示例总结三、什么是迪米特法则?核心思想规则代码示例总结四、什么是开闭原则?理解代码示例总结五、什么是依赖倒......
  • 如何用java代码实现上传文件和下载文件
    如何用java代码实现上传文件:首先创建一个项目创建index.jsp页面如下只要是上传文件就要使用form标签的enctype属性:<!--只要是涉及到上传文件enctype="multipart/form-data"--><formaction="UploadServlet"method="post"enctype="multipart/form-data"> &l......
  • Git 拉取不到远程仓库的最新代码
    问题远程仓库的代码是新版本代码,但本地拉取代码仍然是以前的旧版本解决方法先使用gitfetch抓取到本地,重置版本后再拉取gitfetch--allgitreset--hardorigin/mastergitpull......