发现了 _countof, 欣喜地比较它与 SIZEOF_ARRAY的优缺点, 决定以后能用则用_countof, 并且把程序里所有的SIZEOF_ARRAY替换成了_countof, 却没想到程序中碰到这样的问题:
int ia[3];
#pragma warning(disable: 4127)
if( -2 > _countof(ia) )
{
printf("Hello, world, x\n");
}
竟然结果为true,
*** _countof 的类型类似于 size_t , 是某种 unsigned的整型!
惨痛!
说说怎么预防:
1. VC2008带的VC编译器, cl /W4 也不会得到警告.
cl /Wall 同样不会
公司不让用盗版的Team System了, 所以没了Code Analysis, 但我猜测它也不会.
* 没错, 我知道有人会说, 你把VC当gcc了, 是的, cl.exe 也支持/Wall 选项. cl /? 可以看到, 帮助说明是
/Wall enable all warnings
区分大小写的
2. pc-lint 对这句话
Warning 574: Signed-unsigned mix with relational
发现一个不好的编程方式时, 一个好的做法是, 用pc-lint 的选项 +e"*" 打开所有警告跑一遍它, 然后找找看有没有对应的警告, 如果发现, 就记下它的警告号, 这里是574, 这个警告号对pc-lint 的各个版本来说应该是一样的. 其帮助的PDF文件中还会详细给出说明.
然后, 在CVS服务器上, 把这一条强制进一个代码提交时的自动检查程序, 当然就是pc-lint了. 以保这种错误永远不会发生.
阅读(1649) | 评论(0) | 转发(0) |