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