#c #static-code-analysis #misra
#c #статический анализ кода #мисра
Вопрос:
Статический анализ кода идентифицирует параметры конструктора begin
и end
как имена, которые скрывают соответствующие функции-члены (функции чтения) в соответствии с правилом Misra 2-10-2 (идентификаторы, объявленные во внутренней области, не должны скрывать идентификатор, объявленный во внешней области). Правильно ли это?
template <typename T>
class TLineSegment
{
public:
TLineSegment(const point_typeamp; begin, const point_typeamp; end)
: m_begin(begin)
, m_end(end)
{
}
const point_typeamp; begin() const
{
return m_begin;
}
const point_typeamp; end() const
{
return m_end;
}
private:
point_type m_begin;
point_type m_end;
}
Комментарии:
1. ДА. Внутри конструктора запись
begin
всегда ссылается на параметр (если вы явно не добавляете к нему префиксthis->
)2. Но разве я не стал бы — так же, как я всегда ссылался бы на параметр с
begin
помощью — всегда ссылаться на функцию-член при записиbegin()
?3. @Max Нет,
begin()
попытался бы вызватьoperator()
параметр (который, вероятно, не существует). Круглые скобки не являются частью имени.4. Именно по этой причине существует правило. У вас есть параметр
const point_typeamp; begin
и функция-членconst point_typeamp; begin()
… довольно запутанно. Де-факто стандартным способом именования функций-членов будетget_begin()
etc. Если вы не кодируетеiterator
интерфейс, подобный интерфейсу, тогда имена членов должны быть begin и end, и вместо этого вам придется переименовать параметры.
Ответ №1:
В моем понимании это правило MISRA касается удобочитаемости кода и избежания путаницы, а не нарушения кода.
Итак, с синтаксической точки зрения ваша программа верна, но с точки зрения MISRA она нарушает это правило, поскольку перезаписывает уже существующий идентификатор.
Если довести до крайности, какой-нибудь программист, не уделяющий особого внимания, может запутаться, используя одни и те же имена.
Но с практической точки зрения это действительно деталь, и, на мой взгляд, ее можно оставить такой, какая она есть. Но если ваша компания применяет правила MISRA, вы должны это исправить.
Ответ №2:
Компилятор сначала просматривает имена, а затем решает, что с ними делать. То begin
же самое относится и к имени аргумента функции. Компилятор не будет смотреть дальше этого, чтобы увидеть, есть ли какое-то другое определение, которое можно использовать при вызове функции.