ISO/IEC TS 17961 [liberr]

Не удалось обнаружить и обработать стандартные ошибки библиотеки

Описание

Определение правила

Не удалось обнаружить и обработать стандартные ошибки библиотеки.[1]

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Возвращенное значение чувствительной функции не проверено.

  • Незащищенное динамическое выделение памяти.

Примеры

расширить все

Проблема

Возвращенное значение чувствительной функции, не проверенной, происходит, когда вы вызываете чувствительные стандартные функции, но вы:

  • Игнорируйте возврат значение.

  • Используйте выход или возврат значение, не проверяя валидности значения возврата.

Для этого дефекта рассматриваются два типа функций: чувствительные и критические.

Чувствительная функция является стандартной функцией, которая может столкнуться:

  • Истощенные системные ресурсы (для примера, при распределении ресурсов)

  • Измененные привилегии или разрешения

  • Испорченные источники при чтении, записи или преобразовании данных из внешних источников

  • Неподдерживаемые функции, несмотря на существующий 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
		
	}
}
Проблема

Незащищенное динамическое выделение памяти происходит, когда вы не проверяете после динамического выделения памяти, удалось ли это выделение памяти.

Риск

Когда память динамически выделяется с помощью malloc, calloc, или reallocвозвращает значение NULL если запрошенная память недоступна. Если код, следующий за выделением, обращается к блоку памяти, не проверяя на это NULL значение, этот доступ не защищен от отказов.

Зафиксировать

Проверяйте возврат значение malloc, calloc, или realloc для значения NULL перед доступом к выделенному месту памяти.

#define SIZE 10
//...
int *ptr = malloc(SIZE * sizeof(int));

if(ptr) /* Check for NULL */ 
{
   /* Memory access through ptr */
}

Пример - незащищенная ошибка динамического выделения памяти
#include <stdlib.h>

void Assign_Value(void) 
{
  int* p = (int*)calloc(5, sizeof(int));

  *p = 2;  
  /* Defect: p is not checked for NULL value */

  free(p);
}

Если выделение памяти прекращается, функция calloc возвращает NULL на p. Перед получением доступа к памяти через pкод не проверяет, p является NULL

Коррекция - Проверяйте на значение NULL

Одной из возможных коррекций является проверка, p ли имеет значение NULL до ссоры.

#include <stdlib.h>

void Assign_Value(void)
 {
   int* p = (int*)calloc(5, sizeof(int));

   /* Fix: Check if p is NULL */
   if(p!=NULL) *p = 2; 

   free(p);
 }

Проверяйте информацию

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.