我正在使用Visual Studio 2015 C编译器,但发现它缺少警告。
例如,此代码编译时没有警告或错误(带有-Wall
选项):
#include<stdlib.h>
int main(void)
{
int i = 2;
free(&i);
// The compiler should tell me "You are trying to free something not on the heap".
return 0;
}
有很多原因导致崩溃或/和未定义的行为无法通过-W4
或检测到-Wall
,还有其他选择可用来警告这些错误吗?
我知道我可以使用另一种编译器,但是当您针对Windows平台时,我听说Visual Studio附带的一种更好。
正如您正确指出的那样,使用编译器生成警告不是完全检测到未定义的行为。
启用优化功能奇怪地改善了编译器的报告。它可以发现尚未设置的变量(值跟踪)和一些不需要的值。
要比编译器更进一步,那么诸如Coverity和pc-lint之类的静态分析工具会进行更强大的分析。但是,这些产品也是虚假的,它们会突出一些正确的问题,它们会误解并仍然错过某些不确定的行为。
特别是如果您是跨平台编译的话,我会对编译器的警告(使用gcc和VS进行清理确实很困难,并且可能会损坏您的代码)采取更为宽松的态度,并将您的静态分析工具视为代码查看器。当它提示失败时,请予以尊重,但要假设它可能对代码有误解。
我有一个pc-lint的副本在附近闲逛并得到了...
--- Module: file.c (C)
_
free(&i);
file.c(7) : Warning 424: Inappropriate deallocation (free) for 'auto' data
---
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句