CERT C: Rec. DCL19-C

Минимизируйте осциллограф переменных и функций

Описание

Управляйте определением

Минимизируйте осциллограф переменных и функций. [1]

Примеры

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

Описание

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

  • Объекты, которые заданы в осциллографе файла без 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 спецификатор) и используемый в одном файле только.

Пример - функционирует с внешним рычажным устройством, используемым в одном файле

Заголовочный файл:

/* 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 спецификатор) и названный в том же файле и больше нигде.

Описание

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

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

Риск

Если вы задаете объект в области действия блока, вас, или кто-то еще, менее вероятно, получит доступ к объекту непреднамеренно вне блока.

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

static int ctr;   /* Non compliant */

int checkStatus(void);
void incrementCount(void);

void incrementCount(void) {
    ctr=0;
    while(1) {
        if(checkStatus())
            ctr++;
    }
}

В этом примере, объявлении ctr несовместимо, потому что это объявляется в осциллографе файла, но используется только в функциональном incrementCount. Объявите ctr в теле incrementCount быть MISRA C®-compliant.

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

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

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.