exponenta event banner

Операнд запятнанного подразделения

Операнды работы подразделения (/) происходит из небезопасного источника

Описание

Этот дефект возникает, когда один или оба целочисленных операнда в операции деления поступают из небезопасных источников. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

  • Если числитель является минимально возможным значением, а знаменатель - -1, операция разделения переполняется, поскольку результат не может быть представлен текущим размером переменной.

  • Если знаменатель равен нулю, операция деления может привести к аварийному завершению программы.

Эти риски могут использоваться для выполнения произвольного кода. Этот код обычно выходит за рамки неявной политики безопасности программы.

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

Перед выполнением деления проверьте значения операндов. Проверка знаменателей 0 или -1и числители минимального целого значения.

Примеры

развернуть все

#include <limits.h>
#include <stdio.h>

extern void print_int(int);

int taintedintdivision(void) {
    long num, denum;
    scanf("%lf %lf", &num, &denum);
    int r =  num/denum; 
    print_int(r);
    return r;
}

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

Коррекция - проверка значений

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

#include <limits.h>
#include <stdio.h>

extern void print_long(long);

int taintedintdivision(void) {
    long num, denum;
    scanf("%lf %lf", &num, &denum);
    long res= 0;
    if (denum!=0 && !(num==INT_MIN && denum==-1)) {
        res = num/denum;
    }
    print_long(res);
    return res;
}

Информация о результатах

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_INT_DIVISION
Воздействие: Низкий
CWE ID: 189, 190, 369
Представлен в R2015b