exponenta event banner

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

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

Описание

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

  • Игнорировать возвращаемое значение.

    Вы просто не назначаете возвращаемое значение переменной или явно приводите возвращаемое значение к void.

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

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

  • Исчерпанные системные ресурсы (например, при распределении ресурсов).

  • Изменены привилегии или разрешения.

  • Запятнанные источники при чтении, записи или преобразовании данных из внешних источников.

  • Неподдерживаемые функции, несмотря на существующий API.

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

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

  • Установить привилегии (например, setuid)

  • Создать тюрьму (например, chroot)

  • Создание процесса (например, fork)

  • Создание резьбы (например, pthread_create)

  • Блокировать или разблокировать мьютекс (например, pthread_mutex_lock)

  • Блокировать или разблокировать сегменты памяти (например, mlock)

Риск

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

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

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

Для чувствительных функций, которые не являются критическими, можно явно игнорировать возвращаемое значение, приведя функцию к void. Polyspace ® не поднимает этот дефект для чувствительных функций, отбрасываемых в пустоту. Это решение не принимается для критически важных функций, поскольку они выполняют более уязвимые задачи.

Примеры

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

#include <pthread.h>

void initialize() {
    pthread_attr_t attr;

    pthread_attr_init(&attr); 
}

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

Коррекция - Приведение функции к (void)

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

#include <pthread.h>

void initialize() {
    pthread_attr_t attr;

    (void)pthread_attr_init(&attr); 
}
Коррекция - тестовое значение возврата

Одной из возможных корректировок является проверка возвращаемого значения pthread_attr_init для проверки ошибок.

#include <pthread.h>
#include <stdlib.h>
#define fatal_error() abort()

void initialize() {
    pthread_attr_t attr;
    int result;

    result = pthread_attr_init(&attr);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }
}
#include <pthread.h>
extern void *start_routine(void *);

void returnnotchecked() {
    pthread_t thread_id;
    pthread_attr_t attr;
    void *res;

    (void)pthread_attr_init(&attr);
    (void)pthread_create(&thread_id, &attr, &start_routine, ((void *)0));
    pthread_join(thread_id,  &res); 
}

В этом примере называются две критические функции: pthread_create и pthread_join. Возвращаемое значение pthread_create игнорируется при приведении к недействительности, но потому, что pthread_create является критической функцией (а не только чувствительной функцией), Polyspace не игнорирует это значение Return не проверенного дефекта чувствительной функции. Другая критическая функция, pthread_join, возвращает значение, которое игнорируется неявно. pthread_join использует возвращаемое значение pthread_create, который не был проверен.

Коррекция - проверка возвращаемого значения критических функций

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

#include <pthread.h>
#include <stdlib.h>
#define fatal_error() abort()

extern void *start_routine(void *);

void returnnotchecked() {
    pthread_t thread_id;
    pthread_attr_t attr;
    void *res;
    int result;

    (void)pthread_attr_init(&attr);
    result = pthread_create(&thread_id, &attr, &start_routine, NULL);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }

    result = pthread_join(thread_id,  &res);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: RETURN_NOT_CHECKED
Воздействие: Высокое
CWE ID: 252, 253, 690, 754
Представлен в R2016b