Qualifier removed in conversion

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

Описание

Этот дефект происходит во время преобразования указателя, когда один указатель имеет спецификатор, и другой не делает. Например, при преобразовании от 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