V2641. MISRA. Types should be explicitly specified.

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

Это правило актуально только для С.

Язык С позволяет объявлять сущности без явного указания типа. По стандарту считается, что в таком случае тип сущности будет int. Использование такой особенности языка может привести к путанице или ошибке.

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

// TU1.c
#include <stddef.h>
void *my_malloc (size_t n) { /* Implementation */ }

// TU2.c
#include <stddef.h>

extern my_malloc (size_t n);

В файле TU1.c происходит определение аллоцируещей функции my_malloc, которая принимает размер в байтах и возвращает указатель на выделенную память. Для её использования в файле TU2.c программист вручную написал предварительную декларацию функции, но забыл указать возвращаемый тип. Компилятор в таком случае предполагает, что функция возвращает int. Это может привести к ошибкам на этапе работы программы в том случае, если размер указателя и размер int не совпадают.

Чтобы исправить ошибку, необходимо указать тип данных:

// TU2.c
#include <stddef.h>

extern void *my_malloc (size_t n);

Анализатор также формирует предупреждения на следующие объявления сущностей:

extern var1; // variable declaration of 'int' type
func1() {}   // function declaration with the no return type
static var2; // variable declaration of 'double' type

Исправленные примеры:

extern int var1;    // variable declaration of 'int' type
void func1() {}     // function declaration with the no return type
static double var2; // variable declaration of 'double' type

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

  • MISRA-C-8.1