RM新时代网站-首页

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

靜態(tài)分析工具

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

前言

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

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

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

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

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

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

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

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

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

一、安裝antlr4

進入到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

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

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

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

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

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

node --version

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

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

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

在終端輸入

npm init

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

npm run start

查看是否能正常運行。

安裝JavaScriptantlr4運行時

npm install antlr4 --save

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

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

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

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

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

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

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

-no-listener:表示不生成listener模式的相關代碼支持。

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

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

圖片

編碼

index.js中導入相關的JavsScript文件與庫:

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

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

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

讀取Objective-C文件:

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

利用antlr生成的運行時語法解析文件,將讀取到的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é)點是translationUint。

ObjectiveCParser.g4中的申明可以看出, translationUnit中只申明了兩個子節(jié)點topLevelDeclaration*表示頂層節(jié)點是一個或者多個,與EOF結束節(jié)點。這是因為在同一個源文件中可以申明多個Objective-C的Class。,通過如下代碼即可取到對應的頂層節(jié)點,由于本節(jié)明確只有一個頂層頂點,所以代碼如下:

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中的申明如下:

圖片

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

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

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

圖片

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

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

/// 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;
}

獲取實現(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);
}

最終運行結果如下:圖片

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

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

    關注

    22

    文章

    2108

    瀏覽量

    73618
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • objective-c
    +關注

    關注

    0

    文章

    2

    瀏覽量

    68
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    匯編語言靜態(tài)分析工具設計與應用

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

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

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

    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è)

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

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

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

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

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

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

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

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

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

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

    靜態(tài)分析可幫助面臨壓力的開發(fā)團隊。高質量的版本需要按時交付。需要滿足編碼和合規(guī)性標準。錯誤不是一種選擇。 這就是開發(fā)團隊使用靜態(tài)分析工具/源
    的頭像 發(fā)表于 07-19 12:09 ?1567次閱讀
    什么是<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)分析工具有哪些?

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

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

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

    IAR通過多架構認證的靜態(tài)分析工具加速代碼質量自動化

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

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

    ?和Klocwork的最新版本對靜態(tài)分析工具進行了重大改進,通過盡早修復錯誤、降低開發(fā)成本和加快發(fā)布速度,使開發(fā)團隊實現(xiàn)左移。本文中,我們將概述2024.2版本的新特性和新功能。CI/CD和左移以
    的頭像 發(fā)表于 10-08 16:22 ?273次閱讀
    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>引擎改進和安全增強
    RM新时代网站-首页