exponenta event banner

CERT C: Rec. ERR00-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. 12. Обработка ошибок (ERR)
Представлен в R2019a

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

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

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