exponenta event banner

CERT C: Rec. INT07-C

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

Описание

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

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

Внедрение Polyspace

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

Примеры

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

Проблема

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

  • Сохранение констант, не являющихся символами

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

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

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

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

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

Риск

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

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

При инициализации переменной 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 (неподписанный символ) или i/c = -17 (подписанный символ). Правильный результат неизвестен, не зная о подписанности 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);
}

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

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

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

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