Use of plain char type for numerical value

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

Описание

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

  • Сохранить non-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