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都应该检测到这两个警告。持不同意见的开发人员可以很容易地压制这些特别的警告。

posted on 2020-08-04 08:21  活着的虫子  阅读(185)  评论(0编辑  收藏  举报

导航