MISRA C:2012 Dir 4.7

Если функция возвратит информацию об ошибке, то та информация об ошибке должна быть протестирована

Описание

Направляющее определение

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

Объяснение

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

Реализация Polyspace

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

  • Проигнорируйте возвращаемое значение.

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

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

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

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

  • Измененные привилегии или полномочия.

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

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

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

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

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

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

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

  • Создайте поток (например, pthread_create)

  • Заблокируйте или разблокируйте взаимное исключение (например, pthread_mutex_lock)

  • Заблокируйте или разблокируйте сегменты памяти (например, mlock)

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

Эта директива только частично поддерживается.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

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

void initialize_1() {
    pthread_attr_t attr;
    pthread_attr_init(&attr); //Noncompliant
}

void initialize_2() {
    pthread_attr_t attr;
   (void)pthread_attr_init(&attr); //Compliant
}

void initialize_3() {
    pthread_attr_t attr;
    int result;
    result = pthread_attr_init(&attr); //Compliant
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }
}

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

Чтобы быть совместимыми, можно явным образом бросить возвращаемое значение к void или протестируйте возвращаемое значение pthread_attr_init и проверьте ошибки.

#include <pthread.h>
extern void *start_routine(void *);

void returnnotchecked_1() {
    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)); //Noncompliant
    pthread_join(thread_id,  &res); //Noncompliant
}

void returnnotchecked_2() {
    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); //Compliant
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }

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

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

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

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

Группа: проект Кода
Категория: необходимый
Категория AGC: необходимый
Введенный в R2017a