CERT C++: STR34-C

Приведение символов к беззнаковому char перед преобразованием в большие целочисленные размеры

Описание

Определение правила

Приведение символов к беззнаковому char перед преобразованием в большие целочисленные размеры.[1]

Реализация Polyspace

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

Примеры

расширить все

Проблема

Неправильное использование расширенных знаков значения происходит при преобразовании знака или простого char тип данных для более широкого целочисленного типа данных с расширением знака. Затем вы используете получившееся значение расширения знака как индекс массива, для сравнения с EOF или как аргумент функции обработки символов.

Риск

Сравнение с EOF: Предположим, ваш компилятор реализует простую char введите как подписано. В этой реализации символ с десятичной формой 255 (-1 в форме дополнения двух) сохранен как значение со знаком. Когда вы преобразуете char переменная к более широкому типу данных int например, бит знака сохраняется (расширение знака). Это расширение знака приводит к тому, что символ с десятичной формой 255 преобразуется в целое число -1, которое невозможно отличить от EOF.

Использование в качестве индекса массива: По подобным аргументам вы не можете использовать расширенный знак char переменные как индекс массива. Если бит знака сохранен, преобразование из char на int может привести к отрицательным целым числам. Для индекса массива необходимо использовать положительные целочисленные значения.

Аргумент в функцию обработки символов: По подобным аргументам вы не можете использовать расширенный знак char переменные как аргументы в функции обработки символов, объявленные в ctype.h, для образца, isalpha() или isdigit(). Согласно стандарту C11 (Раздел 7.4), если вы задаете целочисленный аргумент, который не может быть представлен как unsigned char или EOF, результат поведения не определен.

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

Перед преобразованием в более широкий целочисленный тип данных приведите char со знаком или просто значение явно для unsigned char.

Пример - Значение расширенного символа знака по сравнению с EOF
#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()

extern char parsed_token_buffer[20];

static int parser(char *buf)
{
    int c = EOF;
    if (buf && *buf) {
        c = *buf++;    
    }
    return c;
}

void func()
{
    if (parser(parsed_token_buffer) == EOF) { 
        /* Handle error */
        fatal_error();
    }
}

В этом примере функция parser может пройти через строку вход buf. Если символ в строке имеет десятичную форму 255, при преобразовании в int переменная c, его значение становится -1, что неотличимо от EOF. Более позднее сравнение с EOF может привести к ложному положению.

Коррекция - Приведение к unsigned char Перед преобразованием

Одной из возможных коррекций является приведение простого char значение в unsigned char перед преобразованием в более широкий int тип.

#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()

extern char parsed_token_buffer[20];

static int parser(char *buf)
{
    int c = EOF;
    if (buf && *buf) {
        c = (unsigned char)*buf++;    
    }
    return c;
}

void func()
{
    if (parser(parsed_token_buffer) == EOF) { 
        /* Handle error */
        fatal_error();
    }
}

Проверяйте информацию

Группа: 05. Символы и строки (STR)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

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