Почему я получаю CA1811, когда вызываю закрытый метод из открытого метода в C ++ / CLI? - PullRequest
1 голос
/ 18 мая 2010

Я недавно обновил свой проект с Visual Studio 2008 до Visual Studio 2010.

Включив анализ кода и опираясь на Release , я получаю предупреждение 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?

UPDATE

Я решил открыть отчет об ошибке в Microsoft Connect .

Ответы [ 4 ]

3 голосов
/ 12 июня 2010

Ребята из Microsoft воспроизвели эту ошибку и решили не исправлять ее.

Подавление предупреждения - это обходной путь.

Вы можете проголосовать за эту ошибку в 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 голос
/ 01 мая 2012

С документация :

Это правило может сообщать о ложных срабатываниях, если возникают точки входа, которые в настоящее время не определены логикой правила. Кроме того, компилятор может выдавать не вызываемый код в сборку.

Другими словами, я почти уверен, что Microsoft скажет, что это не ошибка, но методы обнаружения этих правил просто еще не очень подробно рассмотрены.

Из той же документации также написано:

Можно безопасно исключить предупреждение из этого правила.

0 голосов
/ 18 мая 2010

Если это происходит только в релизных сборках, я предполагаю, что компилятор сбрасывает вызов на Foo::Bar и просто ToString() возвращает "bar". Вероятно, вы можете проверить это, проверив IL.

0 голосов
/ 18 мая 2010

Предполагает, что вы написали функцию, которая никогда не вызывается.

...