MISRA C++:2008 Rule 9-3-3

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

Описание

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

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

Объяснение

const функции членства не могут изменить элементы данных класса. static функция членства не может изменить нестатические элементы данных класса. Если функция членства не должна изменять нестатические элементы данных класса, ограничьте их доступ к данным путем объявления функций членства как const или static. Такое объявление ясно описывает и осуществляет намерение проекта. Таким образом, если вы непреднамеренно пытаетесь изменить элемент данных через const функция членства, компилятор фиксирует ошибку. Без const объявление, этот вид непреднамеренной ошибки может привести к ошибкам, которые затрудняют, чтобы найти или отладить.

Реализация Polyspace

Средство проверки выполняет эти регистрации этого порядка:

  1. Средство проверки сначала проверяет, получает ли функция члена класса доступ к элементу данных класса. Функции, которые не получают доступ к элементам данных, могут быть объявлены статические.

  2. Средство проверки затем проверяет функции, что элементы данных доступа, чтобы определить, изменяет ли функция какой-либо из элементов данных. Функции, которые не изменяют элементы данных, могут быть объявлены const.

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

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

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

Примеры

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

#include<cstdint>
void Connector(void);
class A
{
public:
	int16_t foo ( ) // Noncompliant 
	{
		return m_i;
	}
	int16_t foo2 ( ) // Noncompliant 
	{
		Connector();// Might have side-effect
		return m_i;
	}
	int16_t foo3 ( ) // Noncompliant
	{
		return m_s;
	}
	int16_t inc_m ( ) // Compliant 
	{
		return ++m_i;
	}
	int16_t& getref()//Noncompliant 
	{
		return m_i_ref; 
	}
private:
	int16_t m_i;
	static int16_t m_s;
	int16_t& m_i_ref;
};

В этом примере Polyspace® отмечает функции foo, foo2, foo3, и getref как несовместимый.

  • Функции foo и foo3 не изменяйте нестатические элементы данных. Поскольку их доступ к данным явным образом не ограничивается путем объявления их как const, Polyspace отмечает эти функции. Чтобы зафиксировать эти дефекты, объявите foo и foo3 как const.

  • Функциональный foo2 явным образом не изменяет ни одного из элементов данных. Поскольку это не объявляется как const, Polyspace отмечает функцию. foo2 вызывает глобальный функциональный Connector, который может иметь побочные эффекты. Не объявляйте foo2 как const функция. На C++ 11 или позже, const функции членства, как ожидают, будут ориентированы на многопотоковое исполнение, но foo2 не может быть ориентировано на многопотоковое исполнение из-за побочных эффектов Connector. Чтобы избежать гонок данных, сохраните foo2 как функция nonconst. Выровняйте по ширине дефект при помощи информации об анализе или комментариев к коду.

  • Функциональный getref не изменяет элементов данных. Поскольку это не объявляется как const, Polyspace отмечает его. Объявление getref как const твердость этот дефект, но этого недостаточно, чтобы ограничить доступ для записи getref потому что это возвращает nonconst ссылку на m_i_ref. Ограничить getref от изменения m_i_ref, тип возврата getref должен также быть const.

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

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