ПроблемаФлажки проверки правил:
Объекты, которые определены в возможности без static спецификатор, который используется только в одном файле.
Функции, которые заданы без static спецификатор, но вызываемый только в одном файле.
Если вы намерены использовать объект или функцию только в одном файле, объявите его статическим.
Объекты, которые определены в возможности без static спецификатор, который используется только в одном файле.
Функции, которые заданы без static спецификатор, но вызываемый только в одном файле.
Polyspace® Bug Finder™ и Polyspace Code Prover™ по-разному проверить это правило кодирования. Анализы могут привести к различным результатам.
Чекер не помечает эту проблему в Polyspace по умолчанию во время анализа You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).
РискПодатливость этому правилу избегает путаницы между вашим идентификатором и идентичным идентификатором в другом модуле перевода или библиотеке. Если вы ограничиваете или уменьшаете видимость объекта, предоставляя ему внутреннее редактирование или отсутствие редактирования, вы или кто-то другой с меньшей вероятностью получаете доступ к объекту непреднамеренно.
Пример - Переменная с внешним редактированием, используемая в одном файлеЗаголовочный файл:
/* file.h */
extern int var;
Первый исходный файл:
/* file1.c */
#include "file.h"
int var; /* Compliant */
int var2; /* Non compliant */
static int var3; /* Compliant */
void reset(void);
void reset(void) {
var = 0;
var2 = 0;
var3 = 0;
}
Второй исходный файл:
/* file2.c */
#include "file.h"
void increment(int var2);
void increment(int var2) {
var++;
var2++;
}
В этом примере:
Декларация var соответствует, потому что var объявляется с внешним редактированием и используется в нескольких файлах.
Декларация var2 не совместим, потому что var2 объявляется с внешним редактированием, но используется только в одном файле.
Может показаться, что var2 определяется в обоих файлах. Однако во втором файле var2 является параметром без редактирования и не совпадает с параметром var2 в первом файле.
Декларация var3 соответствует, потому что var3 объявляется внутренним редактированием (с static спецификатор) и используется только в одном файле.
Пример - Функция с внешним редактированием, используемая в одном файлеЗаголовочный файл:
/* file.h */
extern int var;
extern void increment1 (void);
Первый исходный файл:
/* file1.c */
#include "file.h"
int var;
void increment2(void);
static void increment3(void);
void func(void);
void increment2(void) { /* Non compliant */
var+=2;
}
static void increment3(void) { /* Compliant */
var+=3;
}
void func(void) {
increment1();
increment2();
increment3();
}Второй исходный файл:
/* file2.c */
#include "file.h"
void increment1(void) { /* Compliant */
var++;
}
В этом примере:
Определение increment1 соответствует, потому что increment1 определяется внешним редактированием и вызывается в другом файле.
Декларация increment2 не совместим, потому что increment2 определяется внешним редактированием, но вызывается в том же файле и нигде больше.
Декларация increment3 соответствует, потому что increment3 определяется внутренним редактированием (с static спецификатор) и вызывается в том же файле и нигде больше.