Qualifier removed in conversion

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

Описание

Эта проверка деактивирована в Polyspace по умолчанию® по мере анализа You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

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

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

Риск

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

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

Если второй указатель указывает на тот же объект, но не использует тот же квалификатор, то квалификатор на первом указателе больше не действителен. Для образца, если a 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. The 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
По умолчанию: Off
Синтаксис командной строки: QUALIFIER_MISMATCH
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 704
Введенный в R2013b