AUTOSAR C++14 Rule A21-8-1

Аргументы к обрабатывающим символ функциям должны быть представимыми как char без знака.

Описание

Управляйте определением

Аргументы к обрабатывающим символ функциям должны быть представимыми как char без знака.

Объяснение

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

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

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

Реализация Polyspace

Проверка повышает флаг когда:

  • Вы используете недействительные аргументы с целочисленной функцией от стандартной библиотеки. Эта проверка берет:

    • Преобразование символов

      toupper, tolower

    • Символьные проверки

      isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit

    • Целочисленное деление

      div, ldiv

    • Абсолютные значения

      abs, labs

  • Вы преобразуете со знаком или плоскость char тип данных к более широкому целочисленному типу данных с расширением знака. Вы затем используете получившееся расширенное знаком значение в качестве индекса массива для сравнения с EOF или в качестве аргумента к обрабатывающей символ функции.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <limits.h>
#include <stdlib.h>

int absoluteValue(void) {

    int neg = INT_MIN;
    return abs(neg);
}

Входное значение к abs INT_MIN. Абсолютное значение INT_MIN INT_MAX+1. Этот номер не может быть представлен типом int.

Коррекция — изменяет входной параметр

Одна возможная коррекция должна измениться, входное значение, чтобы соответствовать возвратило тип данных. В этом примере измените входное значение в INT_MIN+1.

#include <limits.h>
#include <stdlib.h>

int absoluteValue(void) {

    int neg = INT_MIN+1;
    return abs(neg);
}
#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 строки. Если символ в строке имеет значение-1, это может представлять любой EOF или значение допустимого символа '\377' (соответствие unsigned char эквивалентные 255). Когда преобразовано в int переменная c, его значение становится целочисленным значением-1, который всегда является EOF. Более позднее сравнение с EOF не обнаружит если значение, возвращенное от parser на самом деле EOF.

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

Одна возможная коррекция должна бросить плоскость char значение к unsigned char перед преобразованием в более широкий int ввод. Только затем можете вы тестировать если возвращаемое значение parser действительно 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 = (unsigned char)*buf++;    
    }
    return c;
}

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

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

Группа: библиотека Strings

Введенный в R2019a