exponenta event banner

CERT C: Rec. INT10-C

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

Описание

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

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

Внедрение Polyspace

Эта проверка проверяет наличие операнда Tainted modulo.

Примеры

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

Проблема

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

Риск

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

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

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

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

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

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

Пример - Modulo с пользовательским вводом
#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;
}

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

Группа: Rec. 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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