CERT C: Rec. INT07-C

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

Описание

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

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

Примеры

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

Описание

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

  • Сохранить несимвольные константы

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

    • Отрицательная величина.

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

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

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

Риск

Операции на простом 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);
}

В этом примере символьная переменная c может быть подписана или без знака в зависимости от вашего компилятора. Принимая 8-битный, дополнительные типы символов two, результатом является любой i/c = 5 (char без знака) или 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 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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