CERT C: Rec. INT07-C

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

Использование простого символьного типа для численного значения обнаруживает 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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