exponenta event banner

MISRA C++: Правило 2008 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