exponenta event banner

CERT C: Rec. DCL07-C

Включить соответствующую информацию о типе в описатели функций

Описание

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

Включите соответствующую информацию о типе в описатели функций [1 ].

Внедрение Polyspace

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

  • Приведение между указателями функций с различными типами.

  • Функция объявлена неявно.

Примеры

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

Проблема

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

При проверке этого правила Polyspace ® учитывает как явные, так и неявные слепки. Однако отливки отNULL или (void*)0 не нарушайте это правило.

Риск

Правило запрещает следующие два преобразования:

  • Преобразование указателя функции в любой другой тип. Это преобразование вызывает неопределенное поведение.

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

    Преобразование запрещено, так как вызов функции через указатель с несовместимым типом приводит к неопределенному поведению.

Пример - Приведение между двумя указателями функций
typedef void (*fp16) (short n);
typedef void (*fp32) (int n);

#include <stdlib.h>                     /* To obtain macro  NULL */

void func(void) {   /* Exception 1 - Can convert a null pointer 
                     * constant into a pointer to a function */
  fp16 fp1 = NULL;                 /* Compliant - exception  */
  fp16 fp2 = (fp16) fp1;           /* Compliant */
  fp32 fp3 = (fp32) fp1;           /* Non-compliant */
  if (fp2 != NULL) {}              /* Compliant - exception  */
  fp16 fp4 = (fp16) 0x8000;        /* Non-compliant - integer to 
                                    * function pointer */}

В этом примере правило нарушается в следующих случаях:

  • Указатель fp1 типа fp16 приводится к типу fp32. Типы указателей функций fp16 и fp32 имеют различные типы аргументов.

  • Целочисленное число приводится к типу fp16.

Правило не нарушается при указателях функций fp1 и fp2 отбрасываются в NULL.

Проблема

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

Риск

Неявное объявление возникает при вызове функции перед ее объявлением или определением. При явном объявлении функции перед ее вызовом компилятор может сопоставить типы аргументов и возвращаемых значений с типами параметров в объявлении. Если происходит неявное объявление, компилятор делает предположения относительно аргумента и возвращаемых типов. Например, он предполагает возвращаемый тип 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 ключевое слово в текущем файле.

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

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

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

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

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