3.6% 的受測試 Python 儲存庫存在缺少逗號錯誤

關於 Python 程式碼易受與程式碼中錯誤使用逗號相關的錯誤的研究結果已經發布。 問題是由於以下事實引起的:在枚舉時,如果列表中的字串沒有用逗號分隔,Python 會自動連接列表中的字串,如果值後面有逗號,也會將值視為元組。 在使用 Python 程式碼對 666 個 GitHub 儲存庫進行自動分析後,研究人員發現 5% 的研究專案可能有逗號問題。

進一步的手動檢查顯示,只有 24 個儲存庫(3.6%)有真正的錯誤,其餘 1.4% 是誤報(例如,可以在行之間故意省略逗號以連接多行檔案路徑、長哈希、HTML區塊或SQL 表達式)。 值得注意的是,在 24 個實際錯誤的儲存庫中,有 Tensorflow、Google V8、Sentry、Pydata xarray、rapidpro、django-colorfield 和 django-helpdesk 等大型專案。 然而,逗號問題並不是 Python 所特有的,並且經常出現在 C/C++ 專案中(最近修復的範例包括 LLVM、Mono、Tensorflow)。

研究的主要錯誤類型:

  • 列表、元組和集合中意外遺失逗號,導致字串被連接而不是被解釋為單獨的值。 例如,在 Sentry 中,其中一項測試遺漏了清單中字串「releases」和「discover」之間的逗號,這導致檢查不存在的「/releasesdiscover」處理程序,而不是檢查「/releases」和「 /發現”單獨。
    3.6% 的受測試 Python 儲存庫存在缺少逗號錯誤

    另一個例子是rapidpro中缺少逗號導致兩個不同的規則在第572行合併:

    3.6% 的受測試 Python 儲存庫存在缺少逗號錯誤

  • 單元素元組定義末尾缺少逗號,導致分配分配常規類型而不是元組。 例如,表達式「values=(1,)」將導致對一個元素的元組的變數進行賦值,但「values=(1)」將導致對整數類型的賦值。 這些賦值中的括號不會影響類型定義並且是可選的,並且解析器僅根據逗號的存在來確定元組的存在。 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # 將被指派一個字串而不是元組。) }
  • 相反的情況是賦值時多了逗號。 如果在賦值末尾意外留下逗號,則會將元組指定為值而不是通常的類型(例如,如果指定「value = 1,」而不是「value = 1」)。

來源: opennet.ru

添加評論