MISRA C++:2008 Rule 0-1-12

Не должно быть никаких неиспользованных параметров (названы или без имени) в наборе параметров для виртуальной функции и всех функций, которые заменяют его

Описание

Управляйте определением

Не должно быть никаких неиспользованных параметров (названы или без имени) в наборе параметров для виртуальной функции и всех функций, которые заменяют его.

Объяснение

Неиспользованные параметры часто указывают на более поздние конструктивные изменения. Вы, возможно, удалили все использование определенного параметра, но забыли удалять параметр из списка параметров.

Неиспользованные параметры составляют ненужные издержки. Можно также непреднамеренно вызвать функцию с различным количеством аргументов, вызывающих несоответствие параметра.

Реализация Polyspace

Для каждой виртуальной функции средство проверки смотрит на все переопределения функции. Если переопределение имеет именованный параметр, который не используется, средство проверки показывает нарушение на исходной виртуальной функции и перечисляет переопределение как событие поддержки.

Обратите внимание на то, что Polyspace проверяет на неиспользованные параметры в виртуальных функциях в одном модулях перевода. Например, если базовый класс содержит виртуальный метод неиспользованным параметром, но реализация производного класса метода использует тот параметр, правило не нарушено. Однако, если базовый класс и производный класс заданы в различных файлах, средство проверки, которое управляет файлом файлом, отмечает нарушение этого правила о базовом классе.

Средство проверки не отмечает неиспользованные параметры в функциях с пустыми телами.

Дополнительное сообщение в отчете

Не должно быть никаких неиспользованных параметров (названы или без имени) в наборе параметров для виртуальной функции и всех функций, которые заменяют его.

Функциональный funcName имеет неиспользованные параметры.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

class base {
    public:
       virtual void assignVal (int arg1, int arg2) = 0; //Noncompliant
       virtual void assignAnotherVal (int arg1, int arg2) = 0;
};

class derived1: public base {
    public:
       virtual void assignVal (int arg1, int arg2) {
           arg1 = 0;
       }
       virtual void assignAnotherVal (int arg1, int arg2) {
           arg1 = 1;
       }
};

class derived2: public base {
    public:
       virtual void assignVal (int arg1, int arg2) {
           arg1 = 0;
       }
       virtual void assignAnotherVal (int arg1, int arg2) {
           arg2 = 1;
       }
};

В этом примере, втором параметре виртуального метода assignVal не используется ни в одной из реализаций производного класса метода.

С другой стороны, реализация виртуального метода assignAnotherVal в производном классе derived1 использует первый параметр метода. Реализация в derived2 использует второй параметр. Оба параметра assignAnotherVal используются и поэтому виртуальный метод не нарушает правило.

Проверяйте информацию

Группа: независимые от языка проблемы
Категория: необходимый

Введенный в R2017b