V3013. It is odd that the body of 'Foo_1' function is fully equivalent to the body of 'Foo_2' function.
Анализатор обнаружил два метода, реализованные идентичным образом. Наличие двух одинаковых методов само по себе не является ошибкой, но служит поводом обратить на них внимание.
Смысл данной диагностики в обнаружении следующей разновидности ошибок:
class Bound
{
....
float GetLeft() { return _left; }
float GetRight() { return _left; }
};
Из-за допущенной опечатки два разных по смыслу метода выполняют одинаковые действия. Корректный вариант:
float GetLeft() { return _left; }
float GetRight() { return _right; }
В приведённом примере идентичность тел методов GetLeft() и GetRight() явно свидетельствует о наличии ошибки. Однако если выдавать предупреждения на все одинаковые методы, то процент ложный срабатываний будет крайне большим. Поэтому анализатор руководствуется целым рядом исключений, когда не стоит предупреждать об одинаковых телах методов. Вот некоторые из них:
- Не сообщается об идентичности тел методов, если в них не используются переменные кроме аргументов. Пример:
bool IsXYZ() { return true; }. - Если методы с одинаковыми телами повторяются более двух раз.
- Тело методов состоит только из инструкции
throw(). - И так далее.
Бороться с ложными срабатываниями можно несколькими способами. Если ложные срабатывания относятся к файлам внешних библиотек или тестов, то путь до файлов или каталога с ними можно добавить в исключения. Если предупреждения относятся к вашему коду, то вы можете использовать комментарий вида //-V3013, который подавит эти предупреждения. Если ложных срабатываний много, то в настройках анализатора вы можете полностью отключить использование данной проверки. Также вы можете модифицировать код таким образом, чтобы один метод вызывал другой.
Пример кода из реального приложения, где разные по смыслу методы реализованы одинаково:
public void Pause(FrameworkElement target)
{
if (Storyboard != null)
{
Storyboard.Pause(target);
}
}
public void Stop(FrameworkElement target)
{
if (Storyboard != null)
{
Storyboard.Stop(target);
}
}
public void Resume(FrameworkElement target)
{
if (Storyboard != null)
{
Storyboard.Pause(target);
}
}
Сделав несколько копий одного метода, разработчики забыли исправить последний метод Resume().
Исправленный фрагмент кода:
public void Resume(FrameworkElement target)
{
if (Storyboard != null)
{
Storyboard.Resume(target);
}
}
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3013. |