>
>
>
V2601. MISRA. Functions should be decla…


V2601. MISRA. Functions should be declared in prototype form with named parameters.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для C. Использование объявлений функций в стиле "K&R", а также неименованных параметров функций небезопасно.

Функции, объявленные в старом стиле – "K&R" – не несут в себе информации о типах и количестве параметров, поэтому использование таких функций может привести к ошибкам.

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

Рассмотрим пример:

// header
void draw();

// .c file
void draw(x, y)
  double x;
  double y;
{
  // ....
}

// usage
void foo()
{
  draw(1, 2);
}

Декларация функции 'draw' не содержит параметров, так что при вызове функции 'draw' в нее будут переданы 2 параметра типа 'int', а не 'double', что является ошибкой. Объявление функции с использованием прототипа исправит проблему:

// header
void draw(double x, double y);

// .c file
void draw(double x, double y)
{
  // ....
}

Если функция не имеет параметров, то объявление с использованием пустых скобок не является правильным, т.к. такое объявление соответствует стилю "K&R":

void foo();

Такая декларация допускает передачу любого числа аргументов. Чтобы явно указать, что функция не имеет параметров, нужно использовать ключевое слово 'void':

void foo(void);

Неименованные параметры делают интерфейс функции менее понятным:

void draw(double, double);

Поэтому следует давать параметрам имена, чтобы избежать ошибок в использовании функции:

void draw(double x, double y);

Данная диагностика классифицируется как:

  • MISRA-C-8.2