exponenta event banner

Правило AUTOSAR C++ 14 M9-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 как неконст-функция. Обоснование дефекта с помощью сведений о проверке или комментариев к коду.

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

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

Группа: Классы
Категория: Обязательно, Автоматизировано
Представлен в R2019a