Tainted division operand

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

Описание

Этот дефект возникает, когда один или оба целочисленных операнда в операции деления поступают из небезопасных источников. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -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++
По умолчанию: Off
Синтаксис командной строки: TAINTED_INT_DIVISION
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 189, 190, 369
Введенный в R2015b