当我从C ++ / CLI中的公共方法调用私有方法时,为什么会获得CA1811?

时间:2010-05-18 16:15:30

标签: visual-studio-2010 c++-cli code-analysis fxcop

我最近将我的项目从Visual Studio 2008升级到Visual Studio 2010。

通过启用代码分析并在发布的基础上构建,我收到警告CA1811:避免使用未调用的私有代码。

我设法将代码缩减为:

.h文件:

public ref class Foo
{
public:
    virtual System::String^ ToString() override;

private:
    static System::String^ Bar();
};

.cpp文件:

String^ Foo::ToString()
{
    return Bar();
}

String^ Foo::Bar()
{
    return "abc";
}

我得到的警告:

  

CA1811:   Microsoft.Performance:   'Foo :: Bar(void)'似乎没有   上游公众或受保护   呼叫者。

Bar()是否为static并不重要。

我试图用C#重现它,但我不能。我只能用C ++ / CLI重现它。

为什么我会收到此警告?

这是Visual Studio 2010的错误吗?

更新

我决定开一个bug report on Microsoft Connect

4 个答案:

答案 0 :(得分:3)

微软的家伙已经复制了这个错误并决定不修复它。

解决警告是解决方法。

非常欢迎您在Microsoft Connect上投票支持此错误。

https://connect.microsoft.com/VisualStudio/feedback/details/560050/getting-ca1811-when-i-call-a-private-method-from-a-public-method-in-c-cli

答案 1 :(得分:1)

来自the documentation

  

如果出现当前未由规则逻辑识别的入口点,则此规则可以报告误报。此外,编译器可能会将不可调用的代码发送到程序集中。

换句话说,我很确定微软会说这不是一个错误,但是这个规则的检测技术还没有被深入讨论。

从同一文档中,它还说:

  

可以安全地禁止此规则发出警告。

答案 2 :(得分:0)

向我建议你写了一个永远不会被调用的函数。

答案 3 :(得分:0)

如果它只发生在发布版本中,我的猜测是编译器正在放弃对Foo::Bar的调用,只是让ToString()直接返回"bar"。您可以通过检查IL来验证这一点。