如果在参数列表中使用了另一个typedef类型的名称,则发出警告
考虑一个大型项目,其中许多类型是typedef
,例如
typedef int age; typedef int height;
和一些函数获取这些类型的参数:
void printPerson(age a, height h) { printf("Age %d, Height %d\n", a, h); }
有没有办法在编译时警告,如果这些参数是错误的类型,例如
age a = 30; height h = 180; printPerson(h, a); /* No warning, because a and h are both integers */
在这种情况下,gcc(或某些静态代码分析工具)是否有选项可以发出警告?
GCC中没有内置支持。
根据Sparse nocast
属性,有一个要添加此function的function请求 。 但是,这还没有实施。 但是,如果可以使用Sparse,则可以通过使用__attribute__((nocast))
标记每个typedef来完成此操作。
在C ++中,您可以通过创建包装类而不是typedef来完成此操作,然后只是不为它们定义隐式转换。
Klocwork有一些与他们称之为“强类型”相关的检查。
对于您的代码,它会抛出STRONG.TYPE.ASSIGN.ARG,因为参数类型不匹配。
它还抱怨将int
值(consts)分配给age
和height
类型的变量,以及在printf
中将变量用作int
。
不过我听说它很贵。
正如其他回复所表明的那样,你不会从gcc中免费获得这个。 您肯定是进入静态分析工具的世界来解决这个问题。
对此有一些建议,其中一些需要额外的注释,其中一些不是,但可能比你正在寻找的更多。 因此,我想我会再投入一个……
我一直坚持使用各种命令行lint工具。 在你的情况下,我认为PC-lint / flexelint非常适合即使它是一个商业工具。 请看这里强大的类型检查。
不,不可能。 如果您正在做(或即将做) 非法的事情,编译器会发出警告。 它不应该知道(或确定)将作为函数参数传递的值的正确性。 只要类型相同,就没有任何理由抱怨。
但是,如果类型不匹配,它会提醒您。
仅当类型不同时才会生成错误。 你可以将这些类型包装在struct中,并使用宏来自动定义和赋值。
如果您愿意使用枚举而不是整数,则可以选择在名为coverity的静态代码分析工具中使用混合枚举时发出警告。
https://wiki.ubuntu.com/CoverityCheckerDictionary寻找MIXED_ENUMS。
正如其他人已经说过的那样,在C中没有对此的支持。如果你绝对想要进行强类型检查,你可以这样做:
typedef struct {int a;} age; typedef struct {int h;} height; void printPerson(age a, height h) { printf("Age %d, height %d\n", aa, hh); } age a = {30}; height h = {180}; printPerson(h, a); // will generate errors
但请注意,这可能会对性能产生一些影响。