NEP 2 — 关于在构建 NumPy 时使用大量警告标志但无警告的提议#

作者:

David Cournapeau

联系方式:

david@ar.media.kyoto-u.ac.jp

日期:

2008-09-04

状态:

已推迟

执行摘要#

在构建 NumPy 和 SciPy 时,我们仅限于使用相当有限的警告编译器集合,从而错失了大量可以通过更强的警告标志检测到的潜在 bug。本 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。