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

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

Описание

Определение правила

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

Объяснение

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

Реализация Polyspace

Проверка выполняется в следующем порядке:

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

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

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

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#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 как неконстатная функция. Обосновать дефект при помощи информации о проверке или комментариев кода.

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

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

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