Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C. Идентификатор, имеющий внешний тип связывания, должен быть уникальным в программе. Это имя не должно быть переиспользовано другими идентификаторами, имеющими отличный от исходного тип связывания (нет связывания, внутреннее связывание) внутри функций или других юнитах трансляции. Правило применимо как для объектов, так и для функций.
Примечание. Для поиска неуникальных идентификаторов в разных юнитах трансляции требуется включить режим межмодульного анализа.
Рассмотрим пример:
int var; // external linkage
void foo()
{
short var; // no linkage
}
В данном коде идентификатор 'var' с внешним типом связывания будет скрыт локальной переменной в функции 'foo'. Корректный код будет выглядеть так:
int var; // external linkage
void foo()
{
short temp; // no linkage
}
Рассмотрим ещё один пример, но на основе содержимого двух файлов одного проекта:
// file1.c
int x; // external linkage
static int y; // internal linkage
static void bar(); // internal linkage
// file2.c
void bar() // external linkage
{
int y; // no linkage
}
void foo() // external linkage
{
int x; // no linkage
}
Идентификаторы 'x' из 'file1.c' и 'bar' из 'file2.c' имеют внешний тип связывания и не являются уникальными, поэтому нарушают данное правило. Идентификатор 'y' не является уникальным, но поскольку в 'file1.c' он имеет внутреннее связывание, а в 'file2.c' не имеет связывания, то данное правило не нарушается для этого имени.
Корректный код:
// file1.c
static int x; // internal linkage
static int y; // internal linkage
static void func(); // internal linkage
// file2.c
void bar() // external linkage
{
int y; // no linkage
}
void foo() // external linkage
{
int x; // no linkage
}
Данная диагностика классифицируется как:
|