Visual Studio /analyze不好之处---漏报(二)
像/analyze这样的静态分析工具必须在报告警告时过于激进(导致过多的误报)和过于胆小(导致过多的误报)之间保持微妙的平衡。我不能分析这些错误,因为我不能分析这些错误。这两个警告在使用gcc生成时都会显示,但在使用visualstudio的/analyze时则不会显示。
返回局部变量地址
第一个很清楚。它与返回局部变量地址的严重错误有关。考虑以下代码:
const char* GetName1() { char name[100]; strcpy_s( name, “This is a name” ); // warning C4172: returning address of local variable or temporary return name; }
正如评论所示,visualstudio给出了一个适当的警告。从警告编号(从4开始),您甚至可以看出这不是/analyze特定的警告。常规编译器会发出此警告。万岁!
现在考虑以下代码:
struct FooBar { char m_name[100]; }; const char* GetName2() { FooBar object; strcpy_s( object.m_name, “This is a name” ); return object.m_name; }
运行时的行为是相同的,唯一的改变是返回局部变量的成员变量的地址。不幸的是,这足以愚弄visualstudio。没有警告。失败。
这不是一个理论问题。几乎这个错误是在我们的代码库中发现的。如果不是gcc,我们就找不到它。Visual Studio需要检测此错误。
不可能的条件
下一个bug涉及不可能条件的测试,如下代码所示:
void ImpossibleTest( unsigned short x ) { if ( x == -1 ) { printf( “It’s a miracle!\n” ); } }
俗话说,这个条件只适用于足够大的-1值。因为x是无符号的,它永远不会等于-1,而且任何整数提升魔法都不会改变这一点。
编译器很容易检查这些类型的不可能条件。左边的数字有固定的范围,右边的数字是常量,没有重叠。
确实,这种类型的警告可能非常嘈杂。某些类型的代码,特别是那些涉及模板的代码,可以合理地生成这些类型的比较,因此可能没有什么可以修复的。但这些情况也常常表明存在缺陷。生成一个带有唯一警告号的警告,以便开发人员可以选择是否忽略它,这是一种简单而适当的方法。
总结
我认为无论是否使用/analyze,visualstudio都应该检测到这两个警告。持不同意见的开发人员可以很容易地压制这些特别的警告。