CERT C: Rec. INT10-C

Не принимайте положительный остаток при использовании оператора%

Описание

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

Не принимайте положительный остаток при использовании оператора%.[1]

Реализация Polyspace

Эта проверка проверяет операнд Tainted по модулю.

Примеры

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

Проблема

Испорченный операнд по модулю проверяет операнды остальных % операции. Bug Finder помечает операции с модулем с одним или несколькими испорченными операндами.

Риск

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

  • Если второй оставшийся операнд -1Ваша оставшаяся операция может переполниться, если оставшаяся операция реализована на основе операции деления, которая может переполниться.

  • Если один из операндов отрицателен, результат операции неопределенен. Для C89 операция с модулем не стандартизирована, поэтому результат от отрицательных операндов задан как реализация.

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

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

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

Пример - Модуль с пользовательским входом
#include <stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem =  128%userden; 
    print_int(rem);
    return rem;
}

В этом примере функция выполняет операцию с модулем при помощи пользовательского ввода. Вход не проверяется перед вычислением остатка значений, которые могут аварийно завершить работу программы, таких как 0 и -1.

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

Одной из возможных корректировок является проверка значений операндов перед выполнением операции с модулем. В этом исправленном примере операция с модулем продолжается только, если второй операнд больше нуля.

#include<stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem = 0;
    if (userden > 0 ) { 
        rem = 128 % userden; 
    }
    print_int(rem);
    return rem;
}

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

Группа: Рек. 04. Целые числа (INT)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.