exponenta event banner

CERT C: Rule DCL31-C

Объявите идентификаторы перед их использованием

Описание

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

Объявите идентификаторы перед их использованием.[1]

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Типы не заданы явным образом.

  • Неявное объявление функции.

Примеры

расширить все

Проблема

Средство проверки правил помечает ситуации, когда параметр функции или тип возврата не задан явным образом. Чтобы включить проверку этого правила, используйте значение c90 для опции C standard version (-c-version).

Риск

В некоторых случаях можно опускать типы из стандарта C90. В этих случаях int неявно задан тип. Однако пропуск явного типа может привести к путанице. Для примера в декларации extern void foo (char c, const k);, тип k является const intНо вы можете ожидать const char.

Возможно, вы используете неявный тип в:

  • Объявления объектов

  • Объявления параметров

  • Объявления представителей

  • typedef декларации

  • Типы возвращаемых функций

Пример - неявные типы
static foo(int a);  /* Non compliant */
static void bar(void);      /* Compliant */

В этом примере правило нарушается, потому что тип возврата foo неявный.

Проблема

Проблема возникает при вызове функции перед объявлением или определением.

Риск

Неявное объявление происходит, когда вы вызываете функцию перед объявлением или определением ее. Когда вы объявляете функцию явным образом перед вызовом, компилятор может соответствовать типам аргументов и возвращений с типами параметров в объявлении. Если происходит неявное объявление, компилятор делает предположения о типах аргументов и возвратах. Например, он принимает тип возврата int. Допущения могут не совпадать с ожидаемым и вызывать нежелательные преобразования типов.

Пример - Функция, не объявленная перед вызовом
#include <math.h>

extern double power3 (double val, int exponent);
int getChoice(void);

double func() {
    double res;
    int ch = getChoice();
    if(ch == 0) {
        res = power(2.0, 10);    /* Non-compliant */
    }
    else if( ch==1) {
        res = power2(2.0, 10);   /* Non-compliant */
    }
    else {
        res = power3(2.0, 10);   /* Compliant */
        return res;
    }
}

double power2 (double val, int exponent) {
    return (pow(val, exponent));
}

В этом примере правило нарушается, когда в коде вызывается функция, которая не объявлена. Даже если определение функции существует позже в коде, происходит нарушение правила.

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

  • Объявите функцию с extern ключевое слово в текущем файле.

  • Объявить функцию в заголовочном файле и включить заголовочный файл в текущий файл.

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

Группа: Правило 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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