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

Переменный спецификатор потерян во время преобразования

Описание

Спецификатор, удаленный в преобразовании, происходит во время преобразования указателя, когда один указатель имеет спецификатор, и другой не делает. Например, при преобразовании от 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
Значение по умолчанию: 'off'
Синтаксис командной строки: QUALIFIER_MISMATCH
Влияние: низко
ID CWE: 704

Введенный в R2013b