注意: 雖然 JavaScript 對於本網站不是必需的,但您與內容的互動將受到限制。請啟用 JavaScript 以獲得完整體驗。

為您的 Python 應用程式交付乾淨安全的程式碼

簡介

如今的開發人員肩負重任——他們不僅要解決行業中一些最大的挑戰,而且還必須從一開始就以最高的程式碼質量和安全標準交付這些解決方案。

這裡重點介紹的成功案例展示了為什麼靜態程式碼分析工具對於改進程式碼質量和程式碼安全至關重要,以及它們如何幫助 Python 社群識別(並修復)一些著名的開源 Python 專案中的錯誤和漏洞。

不斷增長的技術債務和安全擔憂

隨著 Python 應用程式在新穎的用例中快速增長,開發團隊面臨著越來越大的壓力,需要按時完成專案並按計劃交付專案——通常,程式碼可靠性、可維護性和安全性被置於次要地位。這樣做不僅會累積長期的技術債務,還可能在程式碼庫中留下巨大的安全漏洞。

為了儘早發現開發過程中的問題(左移方法),團隊通常對新的和高階的工具感興趣,以檢視它們是否適合其工作流程,是否足夠直觀,以及是否可以幫助他們實現此目標。值得慶幸的是,有許多工具和工作流程可以幫助 Python 使用者。事實上,Python 生態系統擁有豐富的 linting 和靜態分析工具(例如 PyLint、Flake8、Bandit、PyT、PySa 等等),並且大多數 Python 開發人員已經在使用其中一個或多個工具。

在 SonarSource,我們非常熟悉開發社群的需求(和痛點)。事實上,我們認為只有開發人員才能對程式碼質量和程式碼安全產生可持續的影響。這就是為什麼我們構建開源和商業程式碼分析器——SonarLint、SonarCloud、SonarQube,其使命是使團隊能夠在他們現有的工作流程中解決編碼問題。在這一使命中,我們同樣肩負著巨大的責任,這意味著提供精確且可操作的反饋,並以高精度(即最大限度地減少誤報)發現問題。

在下一節中,我們將討論分析流行的開源 Python 專案如何不僅為貢獻者提供出色的反饋,還有助於不斷提高靜態程式碼分析工具的質量和精度——一個協作的、社群驅動的迴圈。

在流行的 Python 專案中發現的錯誤和漏洞

我們使用 SonarCloud 分析了一些開源專案 tensorflow、numpy、salt、sentry 和 biopython,以識別任何巨大的漏洞。我們知道這些高可見性的開源專案經常被數千個專案使用,並且它們的開發工作流程包括所有最佳實踐——程式碼審查、測試覆蓋率、使用多種工具(flake8、pylint、Bandit 等)。我們使用 SonarCloud 分析了這些專案,結果非常有趣。不用說,這些問題很快就被這些專案承認並修復了。

“SonarCloud 發現的一些東西令人印象深刻(可能是由一些自省和/或型別推斷驅動的),而不僅僅是我在大多數 flake8 生態系統中習慣的簡單模式匹配。”

--- Peter J. A. Cock - BioPython 的維護者(此處為原始帖子

下面重點介紹了分析的一些專案示例以及其他工具遺漏但由 SonarCloud 標記的問題。當您閱讀這些內容時,不僅要考慮工具的功能,還要將其視為一個學習機會,以便在將來主動避免類似的陷阱。

型別錯誤

下面的示例顯示了在 Tensorflow 上發現的問題——一個由 Google 開發的開源機器學習平臺。

SonarCloud 具有型別推斷引擎,使其能夠檢測高階型別錯誤。它使用它可以找到的所有資訊來推斷變數型別,包括 Typeshed 存根、賦值和您的型別註釋。同時,如果您不使用型別註釋,它也不會抱怨,並且它旨在避免誤報。

這裡的控制流分析使其能夠理解 state_shape 是一個元組,因為當 output_shape 是一個 tuple 時,它被分配為 output_shape[1:]。該演算法能夠忽略稍後對 output_shapelist 賦值。

無法訪問的程式碼

下面的示例顯示了在 Sentry 上發現的問題——一個 Python 效能和錯誤瓶頸監控庫。

當死程式碼剛好在 returnraise 語句之後時,檢測死程式碼很容易。當 return 是有條件的時,情況會稍微複雜一些。SonarCloud 使用控制流圖來檢測多個分支在到達語句之前退出的情況。

格式化字串中的錯誤欄位

下面的示例顯示了在 Salt 專案上發現的問題——一個用於事件驅動自動化、遠端任務執行和配置管理的 python 包。

在字串格式化期間引用錯誤的欄位名稱或索引非常常見。Pylint 和 Flake8 具有使用字串文字檢測此問題的規則,但當格式字串位於變數中時,它們會遺漏錯誤。

未引發的異常

下面的示例顯示了在 Biopython 上發現的問題——一個用於生物計算和資訊學的工具

當我們審查程式碼時,我們通常會檢視類、變數和其他有意義的符號,並且經常忘記檢查小細節,例如“我的異常之前是否有 raise 關鍵字”。SonarCloud 會分析整個專案以提取型別層次結構。它可以檢測何時丟棄自定義異常,而不僅僅是內建異常。

沒有意義的比較

下面的示例顯示了在 Numpy 上發現的問題——一個用於大型多維陣列和矩陣的數值計算庫。SonarCloud 有許多規則可以檢測沒有意義的程式碼。使用 == 比較不相容的型別永遠不會失敗,但它始終會返回 False,如果您使用 !=,則返回 True。在這裡,我們可以看到一個問題,因為 platform.architecture() 返回一個元組。


這些只是幾個示例,您可以在各個 github 專案上找到專案維護人員標記和修復的所有問題——tensorflownumpysaltsentrybiopython

在正確的時間和地點提供正確的指導

構建和維護優秀的軟體涉及多個團隊使用多個工具,並且重要的是為團隊提供在正確的時間和地點提供正確指導的工具。

SonarLintSonarQubeSonarCloud 可以透過以下方式幫助 Python 開發人員做好他們的工作:

  • 從 IDE 開始,透過程式碼審查工作流程,一直到部署管道的自動化程式碼分析。
  • 在開發週期的早期檢測各種程式碼質量和程式碼安全問題。
  • 幫助團隊“像您編碼一樣清理”,從而使交付的新程式碼具有最高的質量和安全標準,並因此減少長期的技術債務。

為了在您在 IDE 中編寫程式碼時快速檢測問題,SonarLint(開源且完全免費)可從您選擇的 IDE 市場獲得 www.sonarlint.org/

SonarQube 和 SonarCloud 分別是本地和雲解決方案,可幫助專案在您的程式碼儲存庫平臺(例如 GitLab、GitHub、Azure DevOps 或 Bitbucket)中檢測錯誤、漏洞、程式碼異味和安全熱點,從而使團隊只能合併高質量和安全的程式碼。它們對於任何開源專案都是完全免費的。您可以在 www.sonarqube.comwww.sonarcloud.com 試用。

如果您對 Python 程式碼儲存庫中可能隱藏的錯誤或漏洞感到好奇,那麼就像我們以前的示例一樣,立即分析您的專案。這是一個加強您的開發管道並儘早發現問題的絕佳機會。在此過程中,您也可能會發現這是一個很好的學習機會,並發現您可能沒有意識到的最佳實踐和/或危險模式。