靜態代碼掃描是一種檢測項目代碼的方式,能夠在不運行代碼的情況下對代碼進行掃描,可以掃描出代碼的Bug (例如空指針)、漏洞、壞味道(例如方法內代碼行數量過多)等,另外可以檢測倉庫的代碼重複率,註釋率,註釋行,代碼行數,複雜度等信息。 靜態代碼掃描可以在代碼上線之前執行,並且具有執行成本低等特點,被廣泛應用於CI 流水線上。
SonarQube 是一個靜態代碼掃描服務,https://www.sonarqube.org/ ,支持主流語言的代碼掃描,其社區版本在GitHub 開源,地址:https://github.com/SonarSource/sonarqube。 但是對於部分語言,社區版本並不支持,例如Objective-C 和Swift ,本倉庫希望解決的就是這兩種語言的靜態代碼掃描分析。
SonarQube 作為一款成熟的代碼掃描服務,對外提供了插件功能,支持將第三方的掃描工具的結果導入到SonarQube展示,本倉庫基於https://github.com/Idean/sonar-swift 二次開發,在原先功能的基礎上新增了Facebook Infer 掃描結果的導入。
本倉庫作為SonarQube 的iOS代碼掃描插件,支持Objective-C 語言和Swift 語言,支持導入SwiftLint、Infer、OCLint、Lizard、Fauxpas 工具的掃描分析結果。



1.6 版本之後最低要求SonarQube 7.9
我們在公司內部邀請其他同事共同Review了現有的Infer規則,篩選出了部分規則進行掃描,供大家參考。
Infer 是由Facebook公司推出的靜態代碼掃描工具,支持C/C++/Java/Objective-C 語言的掃描。
鏈接:https://github.com/facebook/infer
Swiftlint 是檢查Swift 代碼風格和規定的靜態代碼分析工具,基本上以GitHub's Swift 代碼風格指南為基礎,報告的問題支持在XCode 上展示,並且可以生成報告文件,我們將讀取生成的報告文件,然後上傳到SonarQube 中。
鏈接:https://github.com/realm/SwiftLint
lizard 可以分析出Objective-C 語言的圈複雜度,生成xml 文件,導入到SonarQube 的結果中。
鏈接:https://github.com/terryyin/lizard
OCLint 是一個針對於C/C++/Objective-C 語言的靜態代碼分析工具,它與Infer不同的是,它更偏向於對代碼規範一類問題的掃描,所以我們將OCLint 部分的問題歸類到坏味道上面。
鏈接:https://github.com/oclint/oclint
Faux Pas 是一款商業軟件,支持對Objective-C 語言進行掃描分析。
鏈接:http://fauxpasapp.com/
https://github.com/tal-tech/sonar-swift/releases
將jar 文件放置到SonarQube 的安裝目錄下的extensions/plugins/目錄下,然後重啟SonarQube
參考以下腳本使用
xcodebuild ,並將log 記錄輸出到文件xcodebuild clean build -workspace app.xcworkspace -scheme scheme -destination ' generic/platform=iOS ' COMPILER_INDEX_STORE_ENABLE=NO | tee xcodebuild.log > /dev/null
xcpretty -r json-compilation-database -o compile_commands.json < xcodebuild.log > /dev/null
# --skip-analysis-in-path 是忽略扫描目录
infer run --skip-analysis-in-path Pods --compilation-database compile_commands.json
# 可选,如果有 swift 语言使用
# swiftlint lint > swiftlint.txt
# 可选,Java 语言
# infer run -- ./gradlew build
# 在命令后添加 -Dsonar.java.infer.report=infer-out/report.json
# 可选,如果想计算 复杂度 使用
# lizard --xml > lizard-report.xml
# 在命令后添加 -Dsonar.swift.lizard.report=lizard-report.xml
sonar-scanner -Dsonar.host.url=http://sonarqube -Dsonar.projectKey=app -Dsonar.sources=. -Dsonar.swift.swiftlint.report=swiftlint.txt -Dsonar.swift.infer.report=infer-out/report.json
# oclint example
-Dsonar.swift.oclint.report=oclint_report.xml掃描時必須在macOS 操作系統上運行。
你可以通過掃碼進入微信群
歡迎用戶將公司名在#9 登記(僅供用戶參考)