CERT C: Rec. DCL19-C

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

Описание

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

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

Реализация Polyspace

Это средство проверки проверяет на эти проблемы:

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

  • Объект задан вне необходимого осциллографа.

Примеры

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

Проблема

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

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

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

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

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

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

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

Средство проверки не отмечает эту проблему в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (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 спецификатор) и названный в том же файле и больше нигде.

Проблема

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

Средство проверки правила отмечает 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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