Use of plain char type for numerical value

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

Описание

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

  • Для хранения в не- 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);
}

В этом примере переменная char c может быть подписан или не подписан в зависимости от вашего компилятора. Принимая 8-битные, два типа символов дополнения, результат либо i/c = 5 (беззнаковый char) или i/c = -17 (со знаком char). Правильный результат неизвестен, не зная сигнальности 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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 682, 758
Введенный в R2016b