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 используются, и поэтому виртуальный метод не нарушает правило.

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

Группа: Языковые независимые вопросы
Категория: Требуемая
Введенный в R2016b