exponenta event banner

Квалификатор удален при преобразовании

Квалификатор переменной теряется во время преобразования

Описание

Эта проверка деактивируется в анализе Polyspace ® по умолчанию в качестве кода. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

Этот дефект возникает во время преобразования указателя, когда один указатель имеет квалификатор, а другой - нет. Например, при преобразовании из const int* в int*, преобразование удаляет const квалификатор.

Этот дефект относится только к проектам в C.

Риск

Квалификаторы, такие как const или volatile в объявлении указателя:

const int* ptr;
подразумевать, что базовым объектом является const или volatile. Эти квалификаторы действуют как инструкции для компилятора. Например, const объект не должен изменяться в коде и volatile компилятор не должен оптимизировать объект.

Если второй указатель указывает на тот же объект, но не использует тот же квалификатор, то квалификатор на первом указателе становится недействительным. Например, если const int* указатель и int* указатель указывает на тот же объект, можно изменить объект через второй указатель и нарушить контракт, подразумеваемый const квалификатор в первом указателе.

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

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

Примеры

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

void implicit_cast(void) {
    const char  cc, *pcc = &cc;
    char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}

Во время присвоения символу q, переменные, cc и pcc, преобразуются из const char кому char. const квалификатор удаляется во время преобразования, вызывающего дефект.

Исправление - Добавить квалификаторы

Одной из возможных корректировок является добавление тех же квалификаторов к новым переменным. В этом примере изменение q в const char устраняет дефект.

void implicit_cast(void) {
    const char  cc, *pcc = &cc;
    const char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}
Исправление - Удаление квалификаторов

Одной из возможных корректировок является удаление квалификаторов в преобразованной переменной. В этом примере удаление const квалификатор из cc и pcc инициализация устраняет дефект.

void implicit_basic_cast(void) {
    char  cc, *pcc = &cc;
    char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}

Информация о результатах

Группа: Программирование
Язык: C
По умолчанию: Откл.
Синтаксис командной строки: QUALIFIER_MISMATCH
Воздействие: Низкий
CWE ID: 704
Представлен в R2013b