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

Простая переменная char в арифметической операции без явного, со знаком

Описание

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

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

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

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

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

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

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

Риск

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

Информация о результате

Группа: числовой
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: BAD_PLAIN_CHAR_USE
Влияние: носитель
ID CWE: 682, 758

Введенный в R2017b