ПроблемаЭта проблема возникает при вызове чувствительных стандартных функций, но вы:
Игнорируйте возврат значение.
Используйте выход или возврат значение, не проверяя валидности значения возврата.
Для этого дефекта рассматриваются два типа функций: чувствительные и критические.
Чувствительная функция является стандартной функцией, которая может столкнуться:
Истощенные системные ресурсы (для примера, при распределении ресурсов)
Измененные привилегии или разрешения
Испорченные источники при чтении, записи или преобразовании данных из внешних источников
Неподдерживаемые функции, несмотря на существующий 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();
}
}