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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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