exponenta event banner

Использование запрещенной функции

Функция появляется в черном списке запрещенных функций

Описание

Этот дефект возникает при использовании функции, которая отображается в черном списке запрещенных функций. Чтобы создать черный список:

  • Перечисление функций в XML-файле в определенном синтаксисе.

    Копирование файла шаблона code-behavior-specifications-template.xml из папки polyspaceroot\polyspace\verifier\cxx в доступное для записи расположение и измените файл. Введите каждую функцию в файл, используя следующий синтаксис после существующих аналогичных записей:

    <function name="funcname" behavior="FORBIDDEN_FUNC"/>
    где funcname - имя функции, которую требуется внести в черный список.

  • Укажите этот XML-файл в качестве аргумента для параметра -code-behavior-specifications.

Даже если включить эту проверку с помощью опции Find defects (-checkers), если вы не указываете черный список функций, эта проверка остается отключенной.

Риск

Функция может быть внесена в черный список по одной из следующих причин:

  • Функция может привести ко многим ситуациям, когда поведение не определено, что приводит к уязвимостям безопасности, и существует более безопасная функция.

    Можно включить в черный список функции, которые явно не проверяются существующими чекерами, например: Use of dangerous standard function или Use of obsolete standard function.

  • Функция устаревает в процессе миграции, например, с C++ 98 на C++ 11.

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

Зафиксировать

Замените функцию, включенную в черный список, утвержденной функцией.

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

Примеры

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

#include <csignal>
#include <iostream>

namespace
{
  volatile std::sig_atomic_t gSignalStatus;
}

void signal_handler(int signal)
{
  gSignalStatus = signal;
}

int main()
{
  // Install a signal handler
  std::signal(SIGINT, signal_handler);

  std::cout << "SignalValue: " << gSignalStatus << '\n';
  std::cout << "Sending signal " << SIGINT << '\n';
  std::raise(SIGINT);
  std::cout << "SignalValue: " << gSignalStatus << '\n';
}

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

<function name="std::signal" behavior="FORBIDDEN_FUNC"/>
и укажите XML-файл с помощью опции -code-behavior-specifications.

В результатах анализа все виды использования std::signal помечены этой проверкой.

class orderedPair {
        int var1;
        int var2;
    public:
        orderedPair() {
            var1 = 0;
            var2 = 0;
        }
        orderedPair(int arg1, int arg2) {
            var1 = arg1;
            var2 = arg2;
        }
        orderedPair& operator=(const orderedPair& rhs) {
            var1 = rhs.var1;
            var2 = rhs.var2;
            return *this;
        } 
        orderedPair& operator+(orderedPair& rhs) {
            var1 += rhs.var1;
            var2 += rhs.var2;
            return *this;
        }  
};

void main() {
    int one=1, zero=0, sum;
    orderedPair firstOrderedPair(one, one);
    orderedPair secondOrderedPair(zero, one);
    orderedPair sumPair;
    
    sum = zero + one;
    sumPair = firstOrderedPair + secondOrderedPair;    
}

Предположим, вы хотите определить все местоположения, где оператор перегружается в orderedPair используются классы. Добавьте перегруженные операторы в XML-файл шаблона:

   <function name="orderedPair::operator=" behavior="FORBIDDEN_FUNC"/>
    <function name="orderedPair::operator+" behavior="FORBIDDEN_FUNC"/>
и укажите XML-файл с помощью опции -code-behavior-specifications.

Анализ идентифицирует все вызовы перегруженных операторов и помечает их использование. С помощью этого метода можно различать определенные перегрузки оператора вместо поиска и просмотра всех экземпляров оператора.

Информация о результатах

Группа: Надлежащая практика
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: FORBIDDEN_FUNC
Воздействие: Низкий
Представлен в R2020a