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