exponenta event banner

CERT C: Rec. DCL15-C

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

Описание

Эта проверка деактивируется в анализе Polyspace ® по умолчанию в качестве кода. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

Определение правила

Объявить объекты или функции файловой области, для которых не требуется внешняя связь, статическими. [1 ]

Внедрение Polyspace

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

Примеры

развернуть все

Проблема

Флаги средства проверки правил:

  • Объекты, определенные в области файла без static спецификатор, но используется только в одном файле.

  • Функции, определенные без static спецификатор, но вызывается только в одном файле.

Если предполагается использовать объект или функцию только в одном файле, объявите его статическим.

Объекты, определенные в области файла без static спецификатор, но используется только в одном файле.

Функции, определенные без static спецификатор, но вызывается только в одном файле.

Polyspace Bug Finder™ и Polyspace Code Prover™ проверки этого правила кодирования по-разному. Анализ может дать различные результаты.

Риск

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

Пример - Переменная с внешней связью, используемая в одном файле

Файл заголовка:

/* 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 specifier) и используется только в одном файле.

Пример - Функция с внешней связью, используемой в одном файле

Файл заголовка:

/* 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 specifier) и вызывается в том же файле и нигде.

Проверить информацию

Группа: Rec. 02. Объявления и инициализация (DCL)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.