CERT C: Rec. API04-C

Обеспечьте последовательный и полезный механизм проверки ошибок

Описание

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

Обеспечьте последовательный и полезный механизм проверки ошибок.[1]

Реализация Polyspace

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

Примеры

расширить все

Проблема

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

  • Игнорируйте возврат значение.

  • Используйте выход или возврат значение, не проверяя валидности значения возврата.

Для этого дефекта рассматриваются два типа функций: чувствительные и критические.

Чувствительная функция является стандартной функцией, которая может столкнуться:

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

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

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

  • Неподдерживаемые функции, несмотря на существующий 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 игнорируется, вызывая дефект.

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

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

#include <pthread.h>

void initialize() {
    pthread_attr_t attr;

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

Одной из возможных коррекций является проверка возвращаемого значения 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();
    }
}

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

Группа: Rec. 13. Интерфейсы прикладного программирования (API)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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