exponenta event banner

CERT C: 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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