A proposal to build numpy without warning with a big set of warning flags

作者:大卫Cournapeau
联系:david @ ar 媒体 kyoto-u ac jp
日期:2008-09-04

Executive summary

当构建numpy和scipy时,我们限制在一组相当有限的警告编译器,因此缺少一大类潜在的错误,可以用更强的警告标志检测。这个NEP的目标是提供用于清理代码的各种方法,并实现一些策略,使numpy可构建与更大的警告标志,同时保持构建警告免费。

Warning flags

每个编译器检测一组不同的潜在错误。基线将是gcc -Wall -W-Wextra。理想情况下,一个完整的集将是很好的:

-W -Wall -Wextra -Wstrra-prototypes -Wmissing-prototypes -Waggregate-return -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad- function -cast -Wwrite-strings“

英特尔编译器,VS with / W3 / Wall,Sun编译器也有额外的警告。

Kind of warnings

C Python扩展代码自然会产生大量的虚假警告。目标是有一些工具来标记一些典型的C-Python代码,以便编译器不会在这些情况下生成警告;标签过程必须是干净,可读和健壮的。特别是,它不应该使代码更模糊或更糟,破坏工作代码。

unused parameter

这一个经常出现:任何python可调用的C函数都有两个参数,其中第一个不用于函数(仅适用于方法)。一种解决方法是用宏NPY_UNUSED标记函数参数。这个宏使用编译器特定的代码来标记变量,并且修改它,例如一旦它被标记就不可能使用它。

应用编译器特定选项的代码可以是:

#if defined(__ GNUC__)
#define __COMP_NPY_UNUSED __attribute__((__unused__))
#elif defined(__ ICC)
#define __COMP_NPY_UNUSED __attribute__((__unused__))
#其他
#define __COMP_NPY_UNUSED

#万一

变量调整将是:

#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,便于携带。每变量警告禁用是编译器特定的。

signed/unsigned comparison

更棘手:不总是清楚做什么

half-initialized structures

只是把元素的NULL。