0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

靜態(tài)分析工具

汽車電子技術(shù) ? 來源:程序猿搬磚 ? 作者: 程序猿搬磚 ? 2023-03-02 17:53 ? 次閱讀

前言

在開發(fā)項(xiàng)目的過程當(dāng)中或多或少的會(huì)利用靜態(tài)分析工具來輔助完成一些類似語(yǔ)法檢查、類型分析這樣的工作。掌握必要的靜態(tài)分析能力可以提升項(xiàng)目開發(fā)的效率,減少不必要的低級(jí)錯(cuò)誤。

常用靜態(tài)分析工具

iOS的開發(fā)過程中通常有以下的靜態(tài)分析工具可以使用:

Analyzer:Clang Static Analyzer是一款靜態(tài)代碼掃描工具,專門用于針對(duì)C,C++和Objective-C的程序進(jìn)行分析。已經(jīng)被Xcode集成,可以直接使用Xcode進(jìn)行靜態(tài)代碼掃描分析,也可以單獨(dú)在命令行下使用并提供html格式的輸出報(bào)吿和xml格式的結(jié)果文件方便集成到Jenkins上進(jìn)行展示

Infer:是Facebook開發(fā)的靜態(tài)分析工具。Infer 可以分析 Objective-C, Java 或者 C 代碼,報(bào)告潛在的問題。

OCLint:是一個(gè)強(qiáng)大的靜態(tài)代碼分析工具,它基于clang,可以用來提高代碼質(zhì)量,查找潛在的bug,主要針對(duì)c,c++和Objective-c的靜態(tài)分析,功能非常強(qiáng)大。

以上常用的三款靜態(tài)分析工具都有比較完整的功能實(shí)現(xiàn),內(nèi)部實(shí)現(xiàn)相對(duì)復(fù)雜,靈活性與自定義可擴(kuò)展能力都沒有自己實(shí)現(xiàn)一個(gè)方便,可以基于clang利用C或者C++接口完成靜態(tài)分析,這樣實(shí)現(xiàn)的學(xué)習(xí)與開發(fā)成本也比較大。好有沒有輕量一點(diǎn)的解決方案呢,答案是肯定的: 基于antlr的超輕量分析工具。接下來,本節(jié)將通過完成一個(gè)對(duì)Objective-C的類進(jìn)行分析并打印出相關(guān)信息來說明怎么快速搭建一個(gè)超輕量、可控、高集成的靜態(tài)分析工具。

搭建輕量靜態(tài)分析工具

利用antlr4可以快速搭建一個(gè)輕量的靜態(tài)分析工具,選擇自己合適的語(yǔ)言快速開發(fā)分析業(yè)務(wù)。

一、安裝antlr4

進(jìn)入到antlr官網(wǎng): https://www.antlr.org/,以macOS系統(tǒng)為例,輸入以下命令:

$ cd /usr/local/lib
$ sudo curl -O https://www.antlr.org/download/antlr-4.9.2-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.9.2-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.9.2-complete.jar'
$ alias grun='java org.antlr.v4.gui.TestRig'

安裝完成后,在終端輸入

antlr4

查看是否有以下內(nèi)容輸入,檢查是否安裝成功圖片目前antlrruntime已經(jīng)支持以下語(yǔ)言

  • Java
  • C# (and an alternate C# target)
  • Python (2 and 3)
  • JavaScript
  • Go
  • C++
  • Swift
  • PHP
  • DART

你可以選擇一種你最熟悉或者說當(dāng)前最適合你的語(yǔ)言來開發(fā)靜態(tài)分析工具,本節(jié)實(shí)例將采集JavaScript語(yǔ)言基于Node.js開發(fā)一個(gè)用于分析當(dāng)前Objective-CiOS項(xiàng)目的中所有類實(shí)現(xiàn)的協(xié)議。

二、安裝Node.js開發(fā)環(huán)境

進(jìn)入到Node.js官網(wǎng): https://nodejs.org/zh-cn/,下載一個(gè)長(zhǎng)期支持版本或者當(dāng)前最新的版本都可以,安裝完成Node.js后在終端輸入:

node --version

查看是否正確輸出Node.js的版本。

三、搭建靜態(tài)分析工具

創(chuàng)建Node.js分析工具項(xiàng)目

在終端輸入

npm init

初始化一個(gè)Node.js項(xiàng)目,生成index.js入口文件,添加一個(gè)啟動(dòng)腳本命令,使用Visual Code打開看上去是這樣的,最后它看上去是這樣的:圖片

npm run start

查看是否能正常運(yùn)行。

安裝JavaScriptantlr4運(yùn)行時(shí)

npm install antlr4 --save

生成支持JavsScript解析規(guī)則

antlr這個(gè)地址提供了幾乎所有的語(yǔ)言規(guī)則文件g4: https://github.com/antlr/grammars-v4/tree/master/。這里下載objc需要的規(guī)則文件,如下圖:圖片圖片

ObjectiveCLexer:詞法(Token)解析規(guī)則文件ObjectiveCParser:語(yǔ)法(AST)解析規(guī)則文件

首先利用antlr編譯詞法規(guī)則文件

antlr4 -Dlanguage=JavaScript -no-listener ObjectiveCLexer.g4

然后再編譯語(yǔ)法規(guī)則文件

antlr4 -Dlanguage=JavaScript -no-listener ObjectiveCParser.g4

-no-listener:表示不生成listener模式的相關(guān)代碼支持。

antlr有兩種遍歷模式: visitorlistener。從字面的意思就可以看出visitor是訪問模式,即開發(fā)者主動(dòng)從AST頂層開始一層一層的訪問遍歷AST。而listener則為監(jiān)聽模式,即由運(yùn)行時(shí)從頂層AST開始層層遍歷訪問,當(dāng)訪問到一個(gè)節(jié)點(diǎn)時(shí)回調(diào)開發(fā)者。visitor模式自動(dòng)生成的xxxxVisitor.js需要完善一些方法節(jié)點(diǎn)的方法,以檢查語(yǔ)法中的規(guī)則。而本節(jié)實(shí)例是訪問AST并獲取節(jié)點(diǎn)上某些關(guān)鍵的信息,使用Parser提供的方法即可滿足。

通過以上的antlr命令編譯生成如下的規(guī)則解析文件:

圖片

編碼

index.js中導(dǎo)入相關(guān)的JavsScript文件與庫(kù):

import antlr4 from "antlr4";
import ObjectiveCLexer from "./ObjectiveCLexer.js";
import ObjectiveCParser from "./ObjectiveCParser.js";
import fs from "fs";

由于這里支持ES6import語(yǔ)法,所以package.json中需要申明一下:圖片

準(zhǔn)備好一個(gè)測(cè)試使用的Objective-C的文件,本節(jié)使用的是一個(gè)非常簡(jiǎn)單的頭文件,僅用于說明實(shí)例的使用:圖片

讀取Objective-C文件:

const input = fs.readFileSync("./FSBaseViewController.h", {
  encoding: "utf-8",
});

利用antlr生成的運(yùn)行時(shí)語(yǔ)法解析文件,將讀取到的Objective-C解析成AST

const chars = new antlr4.InputStream(input);
const lexer = new ObjectiveCLexer(chars);
const tokens = new antlr4.CommonTokenStream(lexer);
const parser = new ObjectiveCParser(tokens);
parser.buildParseTrees = true;
const tree = parser.translationUnit();

這里的ObjectiveCParser是根據(jù)ObjectiveCParser.g4生成的規(guī)則解析文件,從ObjectiveCParser.g4中可以到

圖片

ObjectiveCParser.g4申明的頂層節(jié)點(diǎn)是translationUint。

ObjectiveCParser.g4中的申明可以看出, translationUnit中只申明了兩個(gè)子節(jié)點(diǎn)topLevelDeclaration*表示頂層節(jié)點(diǎn)是一個(gè)或者多個(gè),與EOF結(jié)束節(jié)點(diǎn)。這是因?yàn)樵谕粋€(gè)源文件中可以申明多個(gè)Objective-C的Class。,通過如下代碼即可取到對(duì)應(yīng)的頂層節(jié)點(diǎn),由于本節(jié)明確只有一個(gè)頂層頂點(diǎn),所以代碼如下:

const topLevelDeclarationNodes = tree.topLevelDeclaration();
if (topLevelDeclarationNodes.length == 0) return;
const topLevelDeclarationNode = topLevelDeclarationNodes[0];
if (!topLevelDeclarationNode) return;

或者

const topLevelDeclarationNode = tree.topLevelDeclaration(0);
if(!topLevelDeclarationNode) return;

獲取到topLevelDeclarationNode之后,再查看ObjectiveCParser.g4中的申明如下:

圖片

這個(gè)節(jié)點(diǎn)申明了很多種節(jié)點(diǎn)類型,在本節(jié)中關(guān)心的是classInterface節(jié)點(diǎn)。如果你還想進(jìn)一步要判斷協(xié)議中的方法是否實(shí)現(xiàn),可以進(jìn)一步探查clasImplementation節(jié)點(diǎn)。

const classInterfaceNode = topLevelDeclarationNode.classInterface();
if (!classInterfaceNode) return;

ObjectiveCParser.g4classInterface節(jié)點(diǎn)的解析規(guī)則定義如下:

圖片

其中classInterface包含了className,可能包含一個(gè)protocolList它是一個(gè)數(shù)組,即這個(gè)類申明實(shí)現(xiàn)了的Protocol。

獲取class name,ObjectiveCParser.g4中可將節(jié)點(diǎn)推導(dǎo)成一個(gè)TerminalNode節(jié)點(diǎn),節(jié)點(diǎn)包含一個(gè)symbol即節(jié)點(diǎn)的字符串字面量。

/// GenericTypeSpecifierContext
const classNameNode = classInterfaceNode.className;
if (!classNameNode) return;
const classNameIdentifierNode = classNameNode.identifier();
console.log(`class interface name: ${_getSymbolText(classNameIdentifierNode)}`);

其中_getSynbolText函數(shù)定義如下:

function _getSymbolText(identifierNode) {
  if (!identifierNode) return null;
  if (!(identifierNode instanceof ObjectiveCParser.IdentifierContext)) return null;
  if (identifierNode && identifierNode.children && identifierNode.children instanceof Array && identifierNode.children.length > 0) {
    const terminalNodeImpl = identifierNode.children[0];
    if (terminalNodeImpl) {
      const symbol = terminalNodeImpl.symbol;
      if (symbol) {
        return symbol.text;
      }
    }
  }
  return null;
}

獲取實(shí)現(xiàn)的協(xié)議列表:

const protocolList = classInterfaceNode.protocolList();
if (protocolList && protocolList instanceof ObjectiveCParser.ProtocolListContext) {
  const protocolListNames = protocolList.children.map((protocol) => {
    const identifier = protocol.identifier();
    const protocolName = _getSymbolText(identifier);
    return {
      protocolName,
    };
  });
  console.log(protocolListNames);
}

最終運(yùn)行結(jié)果如下:圖片

到這里一個(gè)基于antlr4的快速輕量靜態(tài)分析工具雛形就完成了,多嘗試練習(xí)一下即可在10分鈡搭建一個(gè)能快速集成到你的工程中的靜態(tài)分析工具,這個(gè)集成是輕量的、可控的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

    73453
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
  • objective-c
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    64
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    IAR靜態(tài)分析工具的主要特點(diǎn)有哪些

    IAR靜態(tài)分析工具的主要特點(diǎn)有哪些?IAR靜態(tài)分析工具有何作用?
    發(fā)表于 01-27 06:54

    基于數(shù)據(jù)融合的源代碼靜態(tài)分析

    采用數(shù)據(jù)融合技術(shù)對(duì)源代碼進(jìn)行靜態(tài)分析,實(shí)現(xiàn)可擴(kuò)展的原型系統(tǒng)。對(duì)現(xiàn)有靜態(tài)分析工具分析結(jié)果進(jìn)行解析
    發(fā)表于 04-13 08:57 ?9次下載

    匯編語(yǔ)言靜態(tài)分析工具設(shè)計(jì)與應(yīng)用

    本文針對(duì)當(dāng)前匯編語(yǔ)言的測(cè)試工具較少這一實(shí)際情況,針對(duì)某種匯編語(yǔ)言語(yǔ)法結(jié)構(gòu)特 點(diǎn),確定了匯編語(yǔ)言靜態(tài)分析工具的總體結(jié)構(gòu)框架,并對(duì)工具實(shí)現(xiàn)過程中
    發(fā)表于 06-19 11:52 ?27次下載

    五個(gè)程序員必知的靜態(tài)分析工具推薦

    目前,市面上有許多代碼分析工具,但昂貴的費(fèi)用對(duì)于初創(chuàng)公司和個(gè)人來說有些難以承受。但以下的免費(fèi)靜態(tài)分析工具可以幫助到你。
    的頭像 發(fā)表于 04-05 17:22 ?6109次閱讀

    Krane Kubernetes RBAC靜態(tài)分析工具

    ./oschina_soft/krane.zip
    發(fā)表于 05-16 10:15 ?2次下載
    Krane Kubernetes RBAC<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b><b class='flag-5'>工具</b>

    Klocwork靜態(tài)分析工具的主要功能及應(yīng)用行業(yè)

    Klocwork工具應(yīng)用了靜態(tài)分析技術(shù),可實(shí)現(xiàn)對(duì)C、C++、Java、C#、python等代碼的全面靜態(tài)分析。檢查問題種類既包含軟件質(zhì)量和安
    的頭像 發(fā)表于 05-18 17:40 ?2320次閱讀

    利用靜態(tài)分析工具構(gòu)建模型實(shí)現(xiàn)多核處理器的高質(zhì)量軟件

      為了實(shí)現(xiàn)多核處理器的高質(zhì)量軟件,建議對(duì)數(shù)據(jù)競(jìng)爭(zhēng)采取零容忍政策。使用靜態(tài)和動(dòng)態(tài)技術(shù)的組合來查找它們,并注意不要過度依賴深?yuàn)W的編譯器技術(shù)來修復(fù)它們。
    的頭像 發(fā)表于 06-19 07:52 ?777次閱讀

    靜態(tài)分析與編譯器和數(shù)據(jù)庫(kù)集成

    高級(jí)靜態(tài)分析工具在嵌入式系統(tǒng)開發(fā)中變得越來越重要。遠(yuǎn)遠(yuǎn)超出實(shí)際上是編碼風(fēng)格檢查器的舊靜態(tài)分析工具
    的頭像 發(fā)表于 06-28 14:09 ?875次閱讀
    將<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b>與編譯器和數(shù)據(jù)庫(kù)集成

    靜態(tài)分析工具構(gòu)建模型實(shí)現(xiàn)多核處理器的高質(zhì)量

      為了實(shí)現(xiàn)多核處理器的高質(zhì)量軟件,建議對(duì)數(shù)據(jù)競(jìng)爭(zhēng)采取零容忍政策。使用靜態(tài)和動(dòng)態(tài)技術(shù)的組合來查找它們,并注意不要過度依賴深?yuàn)W的編譯器技術(shù)來修復(fù)它們。這些缺陷是如此危險(xiǎn)和不可預(yù)測(cè),因此系統(tǒng)地消除它們是確保它們不會(huì)造成傷害的唯一安全方法。
    的頭像 發(fā)表于 07-09 06:58 ?593次閱讀

    Harmony系統(tǒng)代碼的靜態(tài)測(cè)試

    本文通過使用靜態(tài)分析工具QAC,來分析測(cè)試Harmony系統(tǒng)代碼對(duì)汽車行業(yè)內(nèi)常用編碼規(guī)范的遵循情況。
    的頭像 發(fā)表于 08-01 14:22 ?1098次閱讀
    Harmony系統(tǒng)代碼的<b class='flag-5'>靜態(tài)</b>測(cè)試

    什么是靜態(tài)代碼分析?靜態(tài)代碼分析概述

    靜態(tài)分析可幫助面臨壓力的開發(fā)團(tuán)隊(duì)。高質(zhì)量的版本需要按時(shí)交付。需要滿足編碼和合規(guī)性標(biāo)準(zhǔn)。錯(cuò)誤不是一種選擇。 這就是開發(fā)團(tuán)隊(duì)使用靜態(tài)分析工具/源
    的頭像 發(fā)表于 07-19 12:09 ?1525次閱讀
    什么是<b class='flag-5'>靜態(tài)</b>代碼<b class='flag-5'>分析</b>?<b class='flag-5'>靜態(tài)</b>代碼<b class='flag-5'>分析</b>概述

    用于嵌入式的常見代碼靜態(tài)分析工具有哪些?

    當(dāng)前標(biāo)準(zhǔn)的C語(yǔ)言編譯器存在普遍只能找出代碼中潛在的缺陷,而對(duì)程序方案設(shè)計(jì)并沒有效。
    發(fā)表于 08-09 10:10 ?1133次閱讀
    用于嵌入式的常見代碼<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b><b class='flag-5'>工具</b>有哪些?

    分享一款不錯(cuò)的嵌入式靜態(tài)代碼掃描工具

    之前給大家分享過嵌入式開發(fā)常用的代碼靜態(tài)分析工具,比如:PC-lint、LDRA、VectorCAST等。
    的頭像 發(fā)表于 10-16 15:39 ?2219次閱讀
    分享一款不錯(cuò)的嵌入式<b class='flag-5'>靜態(tài)</b>代碼掃描<b class='flag-5'>工具</b>

    IAR通過多架構(gòu)認(rèn)證的靜態(tài)分析工具加速代碼質(zhì)量自動(dòng)化

    公司推出經(jīng)TüV SüD認(rèn)證的C-STAT靜態(tài)分析工具,適用于最新發(fā)布的IAR Embedded Workbench for RISC-V V3.30.2功能安全版。
    的頭像 發(fā)表于 06-19 15:49 ?319次閱讀

    Perforce靜態(tài)分析工具2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork分析引擎改進(jìn)和安全增強(qiáng)

    ?和Klocwork的最新版本對(duì)靜態(tài)分析工具進(jìn)行了重大改進(jìn),通過盡早修復(fù)錯(cuò)誤、降低開發(fā)成本和加快發(fā)布速度,使開發(fā)團(tuán)隊(duì)實(shí)現(xiàn)左移。本文中,我們將概述2024.2版本的新特性和新功能。CI/CD和左移以
    的頭像 發(fā)表于 10-08 16:22 ?204次閱讀
    Perforce<b class='flag-5'>靜態(tài)</b><b class='flag-5'>分析</b><b class='flag-5'>工具</b>2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork<b class='flag-5'>分析</b>引擎改進(jìn)和安全增強(qiáng)