exponenta event banner

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

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

Описание

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

  • Для хранения не -char константы.

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

    • Отрицательное значение.

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

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

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

Риск

Операции над простым символом могут привести к неожиданным числовым значениям. Если символ используется в качестве смещения, то он может вызвать переполнение буфера или неполный поток.

Зафиксировать

При инициализации переменной 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 (неподписанный символ) или 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++
По умолчанию: Откл.
Синтаксис командной строки: BAD_PLAIN_CHAR_USE
Воздействие: среднее
CWE ID: 682, 758
Представлен в R2016b