在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

靜態分析工具

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

前言

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

常用靜態分析工具

iOS的開發過程中通常有以下的靜態分析工具可以使用:

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

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

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

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

搭建輕量靜態分析工具

利用antlr4可以快速搭建一個輕量的靜態分析工具,選擇自己合適的語言快速開發分析業務。

一、安裝antlr4

進入到antlr官網: https://www.antlr.org/,以macOS系統為例,輸入以下命令:

$ 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已經支持以下語言

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

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

二、安裝Node.js開發環境

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

node --version

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

三、搭建靜態分析工具

創建Node.js分析工具項目

在終端輸入

npm init

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

npm run start

查看是否能正常運行。

安裝JavaScriptantlr4運行時

npm install antlr4 --save

生成支持JavsScript解析規則

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

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

首先利用antlr編譯詞法規則文件

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

然后再編譯語法規則文件

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

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

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

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

圖片

編碼

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的文件,本節使用的是一個非常簡單的頭文件,僅用于說明實例的使用:圖片

讀取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是根據ObjectiveCParser.g4生成的規則解析文件,從ObjectiveCParser.g4中可以到

圖片

ObjectiveCParser.g4申明的頂層節點是translationUint。

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

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

圖片

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

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

ObjectiveCParser.g4classInterface節點的解析規則定義如下:

圖片

其中classInterface包含了className,可能包含一個protocolList它是一個數組,即這個類申明實現了的Protocol

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

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

其中_getSynbolText函數定義如下:

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

獲取實現的協議列表:

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的快速輕量靜態分析工具雛形就完成了,多嘗試練習一下即可在10分鈡搭建一個能快速集成到你的工程中的靜態分析工具,這個集成是輕量的、可控的。

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

    關注

    22

    文章

    2117

    瀏覽量

    74755
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70222
  • objective-c
    +關注

    關注

    0

    文章

    2

    瀏覽量

    89
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    IAR靜態分析工具的主要特點有哪些

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

    基于數據融合的源代碼靜態分析

    采用數據融合技術對源代碼進行靜態分析,實現可擴展的原型系統。對現有靜態分析工具分析結果進行解析
    發表于 04-13 08:57 ?9次下載

    匯編語言靜態分析工具設計與應用

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

    五個程序員必知的靜態分析工具推薦

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

    Krane Kubernetes RBAC靜態分析工具

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

    Klocwork靜態分析工具的主要功能及應用行業

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

    利用靜態分析工具構建模型實現多核處理器的高質量軟件

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

    靜態分析與編譯器和數據庫集成

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

    靜態分析工具構建模型實現多核處理器的高質量

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

    Harmony系統代碼的靜態測試

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

    什么是靜態代碼分析靜態代碼分析概述

    靜態分析可幫助面臨壓力的開發團隊。高質量的版本需要按時交付。需要滿足編碼和合規性標準。錯誤不是一種選擇。 這就是開發團隊使用靜態分析工具/源
    的頭像 發表于 07-19 12:09 ?1792次閱讀
    什么是<b class='flag-5'>靜態</b>代碼<b class='flag-5'>分析</b>?<b class='flag-5'>靜態</b>代碼<b class='flag-5'>分析</b>概述

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

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

    分享一款不錯的嵌入式靜態代碼掃描工具

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

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

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

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

    ?和Klocwork的最新版本對靜態分析工具進行了重大改進,通過盡早修復錯誤、降低開發成本和加快發布速度,使開發團隊實現左移。本文中,我們將概述2024.2版本的新特性和新功能。CI/CD和左移以
    的頭像 發表于 10-08 16:22 ?535次閱讀
    Perforce<b class='flag-5'>靜態</b><b class='flag-5'>分析</b><b class='flag-5'>工具</b>2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork<b class='flag-5'>分析</b>引擎改進和安全增強
    主站蜘蛛池模板: 99成人国产精品视频 | 狼色影院| 在线天堂bt种子 | 天堂bt资源在线官网 | 泰国一级毛片aaa下面毛多 | 一区二区三区四区电影 | 男人天堂综合网 | 性生交大片免费一级 | 五月天激情开心网 | 日日插天天操 | 福利片在线观看免费高清 | 亚洲精品亚洲人成人网 | 免费国产不卡午夜福在线观看 | va在线| 久久99精品久久久久久秒播 | 亚洲怡红院在线观看 | 欧美福利二区 | 午夜高清免费在线观看 | 日日摸人人看97人人澡 | 97久久天天综合色天天综合色 | 哟交小u女国产精品视频 | 狠狠操精品视频 | haodiaose在线精品免费观看 | 一区二区美女视频 | 夜夜摸夜夜爽 | 国产特黄一级毛片特黄 | 4虎影院在线观看 | 欧美在线成人午夜影视 | 国产拍拍视频 | 99福利| 色批网站www | 又大又粗又爽黄毛片 | 天天看天天爽天天摸天天添 | 亚洲黄色录像 | 国产片一级aaa毛片视频 | 边做饭边被躁欧美三级小说 | 国产黄网站 | 欧美色视频在线 | 中文字幕一区二区三 | 99久久综合 | 午夜精品在线 |