代码之家  ›  专栏  ›  技术社区  ›  brickner

为什么我在C++/CLI中从公共方法调用私有方法时得到CA1811?

  •  1
  • brickner  · 技术社区  · 14 年前

    我最近将我的项目从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。性能: “foo::bar(void)”似乎没有 上游公共或受保护 呼叫者。

    如果 Bar() static 或者没有。

    我试着在C中复制它,但是我不能。我只能用C++或CLI复制它。

    为什么我会收到这个警告?

    这是一个Visual Studio 2010错误吗?

    更新

    我决定开一家 bug report on Microsoft Connect .

    4 回复  |  直到 12 年前
        1
  •  3
  •   brickner    14 年前

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

    抑制警告是解决方法。

    欢迎您在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

        2
  •  1
  •   Mathias Lykkegaard Lorenzen    12 年前

    the documentation :

    如果出现当前未由规则逻辑标识的入口点,则此规则可以报告误报。此外,编译器可能会向程序集中发出不可压缩的代码。

    换句话说,我很肯定微软会说这不是一个bug,但是这个规则的检测技术还没有被很深入的研究。

    在同一份文件中,它还说:

    禁止来自此规则的警告是安全的。

        3
  •  0
  •   Puppy    14 年前

    建议我编写一个从未调用的函数。

        4
  •  0
  •   Mark Rushakoff    14 年前

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