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 "
英特尔编译器、VS(使用 /W3 /Wall
)、Solaris 编译器也有额外的警告。
警告类型#
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 的元素放入其中即可。