ПроблемаВозвращенное значение чувствительной функции, не проверенной, происходит, когда вы вызываете чувствительные стандартные функции, но вы:
Игнорируйте возврат значение.
Используйте выход или возврат значение, не проверяя валидности значения возврата.
Для этого дефекта рассматриваются два типа функций: чувствительные и критические.
Чувствительная функция является стандартной функцией, которая может столкнуться:
Истощенные системные ресурсы (для примера, при распределении ресурсов)
Измененные привилегии или разрешения
Испорченные источники при чтении, записи или преобразовании данных из внешних источников
Неподдерживаемые функции, несмотря на существующий API
Критическая чувствительная функция является чувствительной функцией, которая выполняет одну из следующих критических или уязвимых задач:
Установите привилегии (для примера, setuid
)
Создайте тюрьму (для примера, chroot
)
Создайте процесс (для примера, fork
)
Создайте поток (для примера, thrd_create
)
Блокируйте или разблокируйте сегменты памяти (для примера, mlock
)
РискЕсли вы не проверяете возврата значение функций, которые выполняют чувствительные или критические чувствительные задачи, ваша программа может вести себя неожиданно. Ошибки от этих функций могут распространяться по всей программе, вызывая неправильный выход, уязвимости безопасности и, возможно, отказы в работе системы.
ЗафиксироватьПрежде чем продолжить работу с программой, протестируйте возврат значение критических чувствительных функций.
Для чувствительных функций можно явным образом игнорировать возврат значение, приведя функцию к void
. Polyspace не поднимает этот дефект для чувствительных функций, приведенных к пустоте. Это разрешение не принято для критически важных функций, потому что они выполняют более уязвимые задачи.
Пример - scanf
Возврат функции проигнорирован#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 <stddef.h>
#include <stdlib.h>
void unchecked_memory_allocation(void) {
int * p = (int*)calloc(5, sizeof(int));// C-style allocation
*p = 2; //Noncompliant
//...
delete[] p;
}
В этом примере память динамически выделяется для указателя мыши *p
. Затем указатель используется без проверки выхода операции динамического выделения памяти. Polyspace повышает этот дефект, когда указатели используются после незакрытой операции динамического выделения памяти.
Коррекция - Проверка выхода динамического выделения памятиДля этого дефекта коррекции проверить возврат значение операции new
чтобы убедиться, что функция выполнена должным образом.
#include <stddef.h>
#include <stdlib.h>
void checked_memory_allocation(void) {
int * p = new int[5];
if(p==NULL){// Check output of new
//Handle memory allocation error
}else{
*p = 2; //Compliant
//...
delete[] p;
}
}