Use of a forbidden function

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

Описание

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

  • Списки функции в 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++
По умолчанию: Off
Синтаксис командной строки : FORBIDDEN_FUNC
Влияние: Низкое
Введенный в R2020a