你的位置:人妖 > 俺去啦 >


文爱 软件工程十大手艺之二:代码分析和检查手艺

发布日期:2024-10-21 10:27    点击次数:122


文爱 软件工程十大手艺之二:代码分析和检查手艺

大纲文爱

静态代码分析手艺和用具

AST抽象语法树手艺

动态代码分析手艺和用具

一、静态代码分析手艺和用具

静态代码分析是指无需运行被测代码,仅通过分析或检查源圭臬的语法、结构、过程、接口等来检查圭臬的正确性,找出代码荫藏的诞妄和弱势,如参数不匹配,有歧义的嵌套语句,诞妄的递归,犯科狡计,可能出现的空指针援用等等。

在软件开荒过程中,静态代码分析往往先于动态测试之前进行,同期也不错行为制定动态测试用例的参考。统计讲明,在通盘软件开荒生命周期中,30% 至 70% 的代码逻辑想象和编码弱势是不错通过静态代码分析来发现和耕作的。可是,由于静态代码分析往往要求大批的时刻豪侈和干系常识的蕴蓄,因此关于软件开荒团队来说,使用静态代码分析用具自动化践诺代码检查和分析,简略极地面提高软件可靠性并简约软件开荒和测试本钱。

常见静态代码分析手艺

词法分析:从左至右一个字符一个字符地读入源圭臬,对组成源圭臬的字符流进行扫描,通过使用正则抒发式匹配方法将源代码退换为等价的标记(Token)流,生成干系标记列表。

语法分析:判断源圭臬结构上是否正确,通过使用险阻文无关语法将干系标记整理为语法树。

抽象语法树分析:将圭臬组织成树形结构,树中的干绑缚点代表了圭臬中的干系代码。

语义分析:对结构上正确的源圭臬进行险阻文估量性质的审查。

限度流分析:生成有向限度流图(限度流图CFG是编译器里面用有向图暗示一个圭臬过程的一种抽象数据结构,图中的结点暗示一个圭臬基本块,基本块是莫得任何跳转的礼貌语句代码,图中的边暗示代码中的跳转,它是有向边,开端和极度齐是基本块),用结点暗示基本代码块,结点间的有向边代表限度流旅途,反向边暗示可能存在的轮回;还可生成函数调用关系图,暗示函数间的嵌套关系。

数据流分析:对限度流图进行遍历,纪录变量的驱动化点和援用点,保存干统统据信息。通过静态模拟应用圭臬的践诺旅途,匡助用户找到运行时智商领路的一些严重诞妄,如资源袒露、空指针额外、SQL注入过甚他的安全性裂缝等潜在的运行时诞妄

过失分析:“过失”是指扫数来自不可靠数据源的数据,如用户输入、网络等。基于数据流图判断源代码中哪些变量可能受到膺惩,是考证圭臬输入、识别代码抒发弱势的关键。

规则匹配:静态检测用具通过内置的规则或自界说规则,匹配代码中存在的潜在问题,如安全裂缝、代码肖似等。

常见静态代码分析用具

C++、DevOps、DevSecOps、敏捷开荒、速率和左移战略,这些话题老是说不完谈不尽,但这些也齐与静态代码分析用具息息干系。这么看来,静态代码分析的远景鄙俚疏远。静态代码分析在自动化、安全性和速率方面(至少对比手动检查的速率)的价值是有目共睹的。跟着代码彭胀趋势到来,繁多代码库(C++,people,C++)的问题更值得瞩目。关联词,越来越多的开荒东谈主员入手相识到,静态代码分析有助于提高家具性量、安全性,致使裁汰上市时刻。数据不会说谎,静态代码分析的市集已呈增长趋势。据 MarketWatch 拜谒,2019 群众静态代码分析软件市集领域为 6 亿 4320 万好意思元,展望到 2026 年底将达到 17 亿 3940 万好意思元。这个惊东谈主的增长趋势,也督促着咱们速即去了解静态代码分析用具。是以,让咱们直入正题。

静态代码检测用具的作用和优点

1. 发现潜在问题:静态代码检测用具不错发当代码中存在的潜在问题和弱势,比如内存袒露、空指针援用、资源袒露等,匡助开荒东谈主员实时耕作,提高代码质料。

2. 提高代码可眷注性:静态代码检测用具简略发当代码中的一些不法式的写法和潜在的问题,匡助开荒东谈主员撤职编码法式,提高代码的可读性和可眷注性。

3. 加快开荒历程:静态代码检测用具简略自动化进行代码分析和检查,大大减少了手动代码审查的责任量,提高了开荒效果。

4. 提高安全性:静态代码检测用具简略发当代码中存在的安全裂缝和潜在的安全问题,如SQL注入、跨站剧本膺惩等,匡助开荒东谈主员实时耕作,提高系统的安全性。

常见静态代码检测用具

SonarQube:SonarQube是一个开源的静态代码检测平台,搭救多种编程谈话,如Java、C++、C#、Python等。它简略检测代码中的潜在问题、裂缝、代码肖似和代码袒护率,并提供详备的申报和提倡。

FindBugs:FindBugs是一个基于静态分析的Java代码弱势检测用具,它简略检测出代码中的潜在问题、诞妄和不良本质,并给出相应的耕作提倡。FindBugs的规则库极端丰富,况兼搭救自界说规则。

WuKong:WuKong是一款国产静态代码检测用具,搭救多种谈话,如Java、C++、C#、Python、PHP等。不错检测编码规则、弱势及安全裂缝并给出耕作提倡。WuKong兼容麒麟、龙芯等国产软硬件,领有自主常识产权,可纯真进行定制。

Coverity:Coverity搭救进步20种编译器(主要C/C++),可在编译欠亨过情况下检测,是一款针对C、C++、C#和Java等编程谈话的静态代码检测用具,它简略检测代码中的潜在问题、裂缝和性能问题,并给出相应的耕作提倡。Coverity具有高度可定制性和可扩展性。

Fortify:搭救规则自界说,包括合规信息的识别。搭救Java、C#、C/C++、Python、Ruby 等超20种谈话。它更侧重于安全裂缝检测,搭救规则自界说,包括合规信息的识别。Fortify通过基于规则和裂缝模式的检测引擎来分析代码,识别安全裂缝并提供相应的耕作提倡。

Checkmarx:Checkmarx搭救多种谈话,如Java、JSP、JavaSript、 VBSript、C#等超20种谈话。它简略查找安全裂缝、质料弱势、逻辑问题等。CxSAST无需搭建软件名目源代码的构建环境即可对代码进行数据流分析。

二、AST抽象语法树手艺

什么是AST语法树?

抽象语法树(Abstract Syntax Tree,简称AST)是源代码的抽象语法结构在狡计机内存中的进展表情。它是编译器或解释器在处理源代码时所使用的一种中间暗示表情。AST在编译和代码生成过程中起着关键作用。

AST中的每个节点暗示源代码中的一个语法构造,如变量声明、抒发式、函数调用、限度结构等。树的根节点常常暗示通盘源代码文献,而子节点暗示具体的语法元素过甚关系。举例,一个函数声明的AST节点可能包含多个子节点,如函数名、参数列表和函数体等。

为什么要了解AST

认识AST不错匡助您编写更恰当编程谈话法式的代码,幸免潜在的语法和逻辑诞妄。

灵验期骗编程用具:老练AST有助于您更灵验地使用诸如集成开荒环境(IDE)、代码剪辑器、代码重构用具、静态代码分析用具等开荒用具,从而提高编程效果。

编译器妥协释器开荒:若是您对编译器妥协释器的开荒感兴味,了解AST猛烈常紧迫的,因为它是编译器妥协释器处理源代码的关键数据结构。

代码优化:了解AST有助于您识别和应用代码优化手艺,举例删除无须代码、简化复杂抒发式和优化轮回等,从而提高代码运行性能。

自界说用具开荒:若是您需要为特定领域或任务开荒自界说的代码生成、退换或分析用具,了解AST将使您简略更高效地完成这些责任。

谈话想象与好意思满:若是您有兴味想象和好意思满新的编程谈话或扩展现存编程谈话文爱,了解AST将匡助您更好地认识编程谈话的语法和结构,从而为您的想象和好意思满提供基础。

AST是怎样生成的

抽象语法树(AST)的生成常常是编译器或解释器在处理源代码的过程中产生的。生成AST的过程不错分为以下几个方法:

词法分析:当先,编译器或解释器会对源代码进行词法分析,将源代码剖释为一系列的标记(tokens)。标记是源代码中的最小语法单元,如关键字、标志符、运算符、字面量等。

语法分析:接下来,编译器或解释器会对标记进行语法分析,字据编程谈话的语法规则将它们组合成更高级次的结构,如抒发式、声明和限度结构等。语法分析的终结常常是一个由这些结构组成的抽象语法树。(这里太复杂 请看临了的具体好意思满方法)

构建AST:在语法分析过程中,编译器或解释器会创建AST的节点并安祥配置节点间的关系。每个节点代表一个语法结构,如函数界说、变量声明、赋值语句等。树的根节点常常暗示通盘源代码文献,而子节点暗示具体的语法元素过甚关系。

AST的具体作用

抽象语法树(AST)在编程谈话处理和软件工程中阐发着关键作用。它是源代码的结构化暗示,捕捉了源代码中的语法结构和关系。AST具有以下几个主要作用:

编译器妥协释器的中枢:AST是编译器妥协释器处理源代码的关键数据结构。在对源代码进行语法分析之后,编译器或解释器会生成AST。接下来,它们不错在AST上进行进一步的分析、优化和代码生成。这使得编译器妥协释器简略更高效地处理源代码,为生成可践诺圭臬或践诺剧本提供基础。

代码分析:AST在静态代码分析和静态类型检查中起着紧迫作用。通过分析AST,咱们不错检测代码中的潜在诞妄、不良本质和安全裂缝,从而提高代码质料。

代码退换和优化:编译器、解释器和其他用具(如Babel或Webpack)不错使用AST来进行代码退换和优化。这些用具不错在AST上践诺各式操作,如语法退换(举例将ES6+语法退换为ES5语法)、代码压缩、代码拆分和常量传播等。这有助于提高圭臬的性能和兼容性。

代码生成:基于AST,编译器妥协释器不错生成预备代码(举例机器代码、字节码或其他编程谈话的代码)。这使得跨平台编译和运行成为可能,举例:将C++代码编译为WebAssembly,以便在Web浏览器中运行。

代码重构和剪辑器搭救:AST在代码重构和剪辑器搭救中也起着紧迫作用。通过分析和操作AST,咱们不错好意思满自动化的代码重构、代码补全、语法高亮、诞妄检查等功能,从而提高开荒者的分娩力。

总之,AST在编程谈话处理和软件工程中具有无为的应用,它为分析、优化和生成代码提供了结构化的基础。了解AST有助于更深刻地认识编程谈话的旨趣,提高编程手段和开荒效果。

AST还能作念什么

抽象语法树(AST)在编程谈话处理、软件工程和开荒用具中阐发着关键作用。除了前边究诘过的用途除外,AST还不错用于以下方面:

代码生成器:不错字据AST生成代码模板和脚手架用具。举例,字据类和方法界说生成REST API的客户端和办事器端好意思满。

谈话退换:通过分析源谈话的AST,然后将其退换为预备谈话的AST,不错好意思满源代码到预备代码的退换。举例,将TypeScript代码退换为JavaScript代码。

代码袒护率分析:通过分析AST,咱们不错检测测试用例袒护的代码范围,从而权衡测试质料和查找潜在的裂缝。

文档生成:AST不错用于索求源代码中的扫视、类、方法和属性等信息,从而自动生成API文档。

代码安全性分析:通过分析AST,不错识别不安全的代码模式和潜在的安全裂缝,从而提高软件安全性。

代码审查:AST不错匡助自动化检查代码是否恰当团队的编程法式和商定,从而提高代码质料和一致性。

依赖关系分析:通过分析AST,不错识别源代码中的模块、类和函数之间的依赖关系,从而认识代码结构和优化代码组织。

自动补全和代码导航:通过分析AST,集成开荒环境(IDE)和代码剪辑器不错提供自动补全、代码导航、变量重定名等智能功能,从而提高开荒者的分娩力。

谈话扩展和领域特定谈话(DSL):AST不错用于想象和好意思满领域特定谈话,这些谈话不错更简约地暗示特定领域的问题和责罚决策。举例,通过将DSL退换为预备编程谈话的AST,不错生成可践诺代码。

这些仅是AST在狡计机科学和软件工程中的部分应用。通过对AST进行分析和操作,咱们不错创建更高效、可靠和易于眷注的软件系统。

三、动态代码分析手艺和用具

动态代码分析是一种软件测试方法,通过在运行时践诺圭臬来检测和评估代码的步履和性能。它使用各式手艺来拿获圭臬践诺时间的数据,包括函数调用、变量值、内存使用、CPU期骗率等。这些数据不错用来识别和耕作圭臬中的诞妄、优化圭臬性能以及改造代码质料。

动态代码分析不错匡助责罚哪些问题?

裂缝检测和耕作:动态代码分析不错检测代码中的裂缝和安全问题,并教唆开荒东谈主员进行耕作,以提高应用圭臬的安全性。

性能调优:动态代码分析不错匡助开荒东谈主员找到应用圭臬中的性能瓶颈,以便进行优化和提高应用圭臬的性能。

检测代码诞妄:动态代码分析不错检测代码中的语法诞妄、逻辑诞妄和其他诞妄,并教唆开荒东谈主员进行耕作,以提高应用圭臬的质料和舒服性。

代码袒护率分析:动态代码分析不错匡助开荒东谈主员评估代码的袒护率,以细目测试用例是否裕如全面,以便更好地测试应用圭臬。

代码质料分析:动态代码分析不错评估代码的质料,包括代码结构、可读性、可眷注性和可扩展性等方面,以匡助开荒东谈主员改造代码质料。

静态代码分析和动态代码分析有何不同?

静态代码分析检查代码,以识别逻辑和手艺中的问题。动态代码分析则运行代码和检查终结,这还需要测试代码可能存在的践诺旅途。

即使取舍最基本的模式,当开荒团队测试代码时,他们是在践诺动态分析。而当圭臬员审查代码时,则是在践诺静态分析。非论使用哪种用具,开荒东谈主员和圭臬员齐在践诺分析,最终有助于创建更好的代码。

静态代码和动态代码自身齐不是梦想的取舍,这意味着团队应优化两者。开荒团队不成将静态代码分析和动态代码分析视为非此即彼的关系,而是应将它们视为互补和共生的关系。

动态分析用具的上风

实时监测:动态分析用具不错在代码践诺时实时监测和分析代码的步履。它简略捕捉到传统静态分析用具无法发现的问题,如运行时诞妄、性能瓶颈等。

精采目位:动态分析用具不错提供详备的运行时数据和堆栈追踪,匡助开荒东谈主员精采目位问题方位。它不错减少开荒东谈主员的经营和试错本钱,提高问题责罚的效果。

可视化展示:动态分析用具常常提供直不雅的可视化界面,将复杂的运行时数据以图表、申报等表情展示出来。这有助于开荒东谈主员更直不雅地认识代码的步履和性能情景。

自动化测试:动态分析用具不错与自动化测试框架纠合使用,好意思满自动化的性能测试和诞妄调试。它不错在抓续集成环境中自动运行,提高测试效果和质料。

常见动态代码分析用具

1、FUZZ分析手艺

黑盒分析即是在莫得源代码情况下进行的分析,主要的分析手艺是fuzz。其念念想是对圭臬的输入作念即兴二进制层面的改造,从而尝试遍历各式可能的输入,不雅察圭臬输出从而判定是否存在BUG。

FUZZ亦然不错作念改造的,从而进步效果。

(1)基于语法的fuzz

高中自慰

基本念念路是:减轻纯立时的部分,不要改造输入中表情应该固定的部分。比如一个处理音频的圭臬,那么输入中音频文献固定的那些编码就不消再fuzz了。因为读文献时发现表情分歧圭臬就会立即退出,是以测也没真义。

(2)基于过失分析的fuzz

基本念念路:若是我能知谈输入的哪几位最终会影响输出的话,fuzz就不错更有针对性。那么不错通过过失分析的模式分析输入与输出之间的关联,然后进行针对性的fuzz。

常见FUZZ用具有:Spike,Bunny,teenage mutant ninja turtles,sulley等等

2、标记践诺

白盒分析在领有源代码的要求下进活动态分析,通过模拟堆栈的模式践诺每一条opcode,尝试遍历扫数的旅途。

可是,由于咱们不可能遍历扫数的输入,那么怎样实在真义上达到遍历扫数旅途呢?谜底即是标记践诺

标记践诺的主张其实极端简便,对一个不细主义值,用一个标记来代表他。若是这个值用于分支语句,那么对分支的每一条旅途齐增多一个该值的截止要求。当旅途终结时,抽象扫数的截止要求,咱们就不错得到该变量的值域。

通过标记践诺的方法,咱们就不错尝试遍历扫数旅途。

(1)将输入标记化

(2)在扫数的分支处齐践诺state的复制和差别践诺

这么表面上就可能遍历圭臬的扫数分支。

3、代码袒护率统计

jacoco

Jacoco是一个开源的袒护率用具。Jacoco不错镶嵌到Ant 、Maven中,并提供了EclEmma Eclipse插件,也不错使用JavaAgent手艺监控Java圭臬。好多第三方的用具提供了对Jacoco的集成,如Jenkins。

4、性能调优的用具

1)大喊行分析用具(Command-line profiling tools)

jstat:获得JVM的heap使用和GC的性能统计数据

jmap:输出内存中的对象散布情况

jhat:导出heap dump,浏览/查询其中的对象散布情况

jstack:获得Java线程的stacktrace(用途:定位线程出现万古刻停顿的原因,如多线程间死锁、死轮回、央求外部资源导致的万古刻恭候等。线程出现停顿的时候通过jstack来巡视各个线程的调用堆栈,就不错知谈莫得反应的线程到底在后台作念什么事情,或者恭候什么资源。)

2)JConsole(GUI监控用具)

3)Visual VM

4)MAT(Eclipse Memory Analyzer)

5、圭臬调试器

1)WinDbg

WinDbg是Windows平台上一款功能刚劲的调试器,它不错用于对土产货或辛苦进度进活动态调试和分析。WinDbg搭救多种调试功能,包括断点成立、内存监控、寄存器巡视等,不错用于动态分析代码的践诺过程。

2)GDB

GDB是一款开源的调试器,主要用于在Linux和UNIX系统上对圭臬进行调试和动态分析。GDB搭救多种处理器架构,并提供丰富的调试功能,不错匡助开荒东谈主员和安全众人在代码践诺过程中进行监控和分析。

3)OllyDbg

OllyDbg是一款Windows平台上无为使用的动态调试器和逆向工程用具。它提供了刚劲的动态分析功能文爱,包括断点成立、内存监控、寄存器巡视等,不错匡助逆向工程师深刻分析代码的践诺过程。

本站仅提供存储办事,扫数本色均由用户发布,如发现存害或侵权本色,请点击举报。

    热点资讯

    相关资讯