NEP 2 — 關於在大量警告標記下構建 numpy 且不產生警告的提案#
- 作者:
David Cournapeau
- 聯絡方式:
- 日期:
2008-09-04
- 狀態:
延遲
執行摘要#
當構建 numpy 和 scipy 時,我們僅限於一組非常受限的警告編譯器,因此錯失了大量潛在錯誤,這些錯誤可以透過更強的警告標記檢測到。此 NEP 的目標是呈現用於清理程式碼的各種方法,並實作一些政策,使 numpy 能夠在更大的警告標記集下構建,同時保持構建過程無警告。
警告標記#
每個編譯器檢測到的潛在錯誤集都不同。基準將是 gcc -Wall -W -Wextra。理想情況下,完整集合會更好
-W -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return
-Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast
-Wwrite-strings "
Intel 編譯器、具有 /W3 /Wall
的 VS、Sun 編譯器也具有額外警告。
警告種類#
C Python 擴充程式碼自然傾向於產生大量偽警告。目標是提供一些工具來標記一些典型的 C-Python 程式碼,以便編譯器在這些情況下不會產生警告;標記過程必須清晰、可讀且穩健。特別是,它不應使程式碼更晦澀難懂,或更糟的是,破壞運作中的程式碼。
未使用的參數#
這個問題經常出現:任何可 Python 呼叫的 C 函數都接受兩個參數,其中第一個參數不用於函數(僅用於方法)。解決此問題的一種方法是使用巨集 NPY_UNUSED 標記函數參數。此巨集使用編譯器特定的程式碼來標記變數,並修改它,使其在標記後不可能意外使用它。
套用編譯器特定選項的程式碼可以是
#if defined(__GNUC__)
#define __COMP_NPY_UNUSED __attribute__ ((__unused__))
# elif defined(__ICC)
#define __COMP_NPY_UNUSED __attribute__ ((__unused__))
#else
#define __COMP_NPY_UNUSED
#endif
變數修改將是
#define NPY_UNUSED(x) (__NPY_UNUSED_TAGGED ## x) __COMP_NPY_UNUSED
當套用到變數時,會得到
int foo(int * NPY_UNUSED(dummy))
展開為
int foo(int * __NPY_UNUSED_TAGGEDdummy __COMP_NPY_UNUSED)
因此避免意外使用變數。修改是純 C 語言,因此是可移植的。每個變數的警告停用是編譯器特定的。
有號/無號比較#
更棘手:並非總是清楚該怎麼做
半初始化的結構#
只需將元素放入 NULL 即可。