V2658. MISRA. Dead code should not be used in a project.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для языка C.
В программе не должен содержаться мёртвый код. Под этим подразумевается код, удаление которого не меняет видимого поведения программы.
Наличие такого кода указывает на ошибку в логике программы, а также усложняет её понимание и отладку.
Исключения:
- недостижимый код не является мёртвым, так как он не может быть выполнен;
- неиспользуемая проинициализированная переменная не считается мёртвым кодом, так как инициализация не является операцией присваивания;
- преобразование к
voidтипу, результат которого не используется, не является мёртвым кодом, так как это указывает на значение, которое намерено не используется; - оператор приведения типов, результат которого используется.
Примечание. Компилятор имеет право удалить мёртвый код, так как это не повлияет на видимое поведение программы.
Рассмотрим пример избыточных операций:
int func( int input )
{
short var;
char *ptr;
var = 11; // <=
(int)var; // <=
var + input; // <=
*ptr++; // <=
return input + input;
}
В приведённом примере есть несколько операций: присваивание (=), приведение типа ((int)), сложение (+), инкремент указателя ptr, а также его разыменование (*). Они являются избыточными, так как результат вычисления этих операций не используется и не влияет на выполнение программы.
Корректный код:
int func( int input )
{
short var;
int *ptr;
ptr = &input;
var = 11;
input += (int)var;
(*ptr)++;
return input;
}
Рассмотрим пример избыточного вызова функции:
void funcToCall ( int input )
{
return;
for(size_t i = 0; i < 13; ++i)
{
input += i;
}
}
int funcBase ( int input )
{
funcToCall(input);
return input + input;
}
Функция funcToCall не является мёртвым кодом, поскольку содержит операции исключительно в недостижимом коде. Однако вызов функции — это мёртвый код, поскольку его удаление не меняет поведение программы.
Пример корректного кода:
unsigned int funcToCall ( unsigned int x )
{
for(size_t i = 0; i < 13; ++i)
{
x += i;
}
return x;
}
unsigned int funcBase ( unsigned int x )
{
return funcToCall(x);
}
Данная диагностика классифицируется как:
|