CERT C: Rule INT30-C

Убедитесь, что операции беззнаковых целых чисел не переносятся

Описание

Управляйте определением

Убедитесь, что операции беззнаковых целых чисел не переносятся. [1]

Примеры

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

Описание

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

Точное выделение ресурсов хранения для различных типов с плавающей точкой зависит от вашего процессора. Смотрите Target processor type (-target).

Риск

Стандарт C11 утверждает, что беззнаковое целое переполняет результата во всеобъемлющем поведении. Однако переносить поведение не может всегда быть желательным. Например, если результат расчета используется в качестве размера массивов и переполнения расчета, размер массивов намного меньше, чем ожидалось.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.

Можно зафиксировать дефект:

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

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

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Пример - добавляет тот в максимум Целое число без знака

#include <limits.h>

unsigned int plusplus(void) {

    unsigned uvar = UINT_MAX;
    uvar++;
    return uvar;
}

В третьем операторе этой функции, переменной uvar увеличен на 1. Однако значение uvar максимальное значение беззнаковых целых чисел, таким образом, 1 плюс максимальное целочисленное значение не может быть представлен unsigned int. Стандарт языка программирования C не просматривает переполнение без знака как ошибку, потому что программа автоматически уменьшает результат модулем максимальное значение плюс 1. В этом примере, uvar уменьшается UINT_MAX по модулю. Результатом является uvar = 1.

Коррекция — различный тип хранения

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

#include <limits.h>

unsigned long long plusplus(void) {

    unsigned long long ullvar = UINT_MAX;
    ullvar++;
    return ullvar;
}

Описание

Постоянное переполнение беззнакового целого происходит, когда вы присваиваете время компиляции, постоянное переменной беззнаковых целых чисел, тип данных которой не может разместить значение. n- битное беззнаковое целое содержит значения в области значений [0, 2n-1].

Например, c 8-битный char без знака переменная, которая не может содержать значение 256.

unsigned char c = 256;

Чтобы определить размеры фундаментальных типов, Средство поиска Ошибки использует вашу спецификацию в Target processor type (-target).

Риск

Стандарт C утверждает, что переполнение беззнакового целого должно быть перенесено (см., например, стандарт C11, разделите 6.2.5). Однако всеобъемлющее поведение может быть непреднамеренным и вызвать неожиданные результаты.

Фиксация

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

Пример - переполнение постоянного от макрорасширения

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned char c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned short c2 = MAX_UNSIGNED_SHORT + 1;
}

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

Коррекция — использует более широкий тип данных

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

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned short c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned int c2 = MAX_UNSIGNED_SHORT + 1;
}

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

Группа: правило 04. Целые числа (INT)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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