CERT C: Rec. INT07-C

Используйте только явно подписанный или беззнаковый тип char для числовых значений

Описание

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

Используйте только явно подписанный или беззнаковый тип char для числовых значений.[1]

Реализация Polyspace

Эта проверка проверяет Использование простого типа char для числового значения.

Примеры

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

Проблема

Использование простого типа char для определения численного значения char переменные без явной сигнальности, которые используются следующими способами:

  • Как хранить некаровые константы

  • В арифметической операции, когда char является:

    • Отрицательное значение.

    • Результат изменения знака переполнения.

  • Как смещение буфера.

char переменные без signed или unsigned в зависимости от компилятора может быть либо подписан, либо не подписан.

Риск

Операции на простом char могут привести к неожиданным числовым значениям. Если char используется в качестве смещения, char может вызвать переполнение буфера или нижнее течение.

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

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

Пример - Разделите по char Переменная
#include <stdio.h>

void badplaincharuse(void)
{
    char c = 200;
    int i = 1000;
    (void)printf("i/c = %d\n", i/c);
}

В этом примере переменная char c может быть подписан или не подписан в зависимости от вашего компилятора. Принимая 8-битные, два типа символов дополнения, результат либо i/c = 5 (беззнаковый char) или i/c = -17 (со знаком char). Правильный результат неизвестен, не зная сигнальности char.

Коррекция - Добавить signed Определитель

Одной из возможных коррекций является добавление signed квалификатор к char. Это уточнение определяет операцию.

#include <stdio.h>

void badplaincharuse(void)
{
    signed char c = -56;
    int i = 1000;
    (void)printf("i/c = %d\n", i/c);
}

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

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

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

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