ПроблемаВозвращенное значение не проверенной чувствительной функции возникает при вызове чувствительных стандартных функций, но вы:
Для этого дефекта рассматриваются два типа функций: чувствительная и критическая чувствительная.
Чувствительная функция - это стандартная функция, с которой можно столкнуться:
Исчерпанные системные ресурсы (например, при распределении ресурсов)
Измененные привилегии или разрешения
Запятнанные источники при чтении, записи или преобразовании данных из внешних источников
Неподдерживаемые функции, несмотря на существующий API
Критическая чувствительная функция - это чувствительная функция, выполняющая одну из следующих критических или уязвимых задач:
Установить привилегии (например, setuid)
Создать тюрьму (например, chroot)
Создание процесса (например, fork)
Создание резьбы (например, thrd_create)
Блокировать или разблокировать сегменты памяти (например, mlock)
РискЕсли не проверить возвращаемое значение функций, выполняющих важные или критически важные задачи, программа может вести себя неожиданно. Ошибки этих функций могут распространяться по всей программе, вызывая неправильные выходные данные, уязвимости безопасности и, возможно, сбои системы.
ЗафиксироватьПеред продолжением работы с программой проверьте возвращаемое значение критически важных функций.
Для чувствительных функций можно явно игнорировать возвращаемое значение, приведя функцию к void. Polyspace ® не поднимает этот дефект для чувствительных функций, отбрасываемых в пустоту. Это решение не принимается для критически важных функций, поскольку они выполняют более уязвимые задачи.
Пример - Возврат чувствительной функции проигнорирован#include<stdio.h>
void initialize() {
int n = 1;
scanf("%d",&n);
}В этом примере показан вызов чувствительной функции scanf(). Возвращаемое значение scanf() игнорируется, вызывая дефект.
Коррекция - Приведение функции к (void)Одной из возможных корректировок является приведение функции в пустоту. Это исправление информирует Polyspace и любых рецензентов о том, что возвращаемое значение чувствительной функции явно игнорируется.
#include<stdio.h>
void initialize() {
int n = 1;
(void) scanf("%d",&n);
} Коррекция - тестовое значение возвратаОдной из возможных корректировок является проверка возвращаемого значения scanf для проверки ошибок.
#include<stdio.h>
void initialize() {
int n,flag ;
flag = scanf("%d",&n);
if(flag>0){
//...
}
} Пример - Критическая функция, возврат пропущен#include <threads.h>
int thrd_func(void);
void initialize() {
thrd_t thr;
int n = 1;
(void) thrd_create(&thr,thrd_func,&n);
}В этом примере критическая функция thrd_create вызывается и его возвращаемое значение игнорируется при приведении к недействительности, но потому, что thrd_create является критической функцией, Polyspace не игнорирует это значение Return чувствительной функции, не проверенной на дефект.
Коррекция - проверка возвращаемого значения критических функцийКоррекция для этого дефекта заключается в проверке возвращаемого значения этих критических функций для проверки выполняемой функции.
#include <threads.h>
int thrd_func(void);
void initialize() {
thrd_t thr;
int n = 1;
if( thrd_success!= thrd_create(&thr,thrd_func,&n) ){
// handle error
}
}