ISO/IEC TS 17961 [alignconv]

Преобразование значений указателя к более строго выровненным типам указателей

Описание

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

Преобразование значений указателя к более строго выровненным типам указателей. [1]

Примеры

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

Описание

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

Риск

Разыменование неправильно выровненного указателя имеет неопределенное поведение и может заставить вашу программу отказывать.

Фиксация

Предположим, что вы преобразуете указатель ptr1 к ptr2. Если ptr1 точки к буферу N байты и ptr2 type * указатель, где sizeof (type) n байты, убедитесь тот N целочисленное кратное n.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Пример - динамическое выделение указателей

#include <stdlib.h>

void dyn_non_align(void){
    void *ptr = malloc(13);
    long *dest;

    dest = (long*)ptr; //defect
}

В этом примере программное обеспечение повышает дефект на преобразовании ptr к long*. Динамически выделенная память о ptr, 13 байтов, не кратное размеру dest, 4 байта. Это неточное совмещение вызывает Неправильный выделенный размер объекта для дефекта броска.

Коррекция — изменяет размер указателя

Одна возможная коррекция должна использовать размер указателя, который является кратным целевому размеру. В этом примере разрешите дефект путем изменения выделенной памяти 12 вместо 13.

#include <stdlib.h>

void dyn_non_align(void){
    void *ptr = malloc(12);
    long *dest;

    dest = (long*)ptr;
}

Пример - статическое выделение указателей

void static_non_align(void){
    char arr[13], *ptr;
    int *dest;

    ptr = &arr[0];
    dest = (int*)ptr; //defect
}

В этом примере программное обеспечение повышает дефект на преобразовании ptr к int* в линии 6. ptr имеет емкость памяти 13 байтов потому что массив arr имеет размер 13 байтов. Размер dest 4 байта, который не является кратным 13. Это неточное совмещение вызывает Неправильный выделенный размер объекта для дефекта броска.

Коррекция — изменяет размер указателя

Одна возможная коррекция должна использовать размер указателя, который является кратным целевому размеру. В этом примере разрешите дефект путем изменения размера массива arr к кратному 4.

void static_non_align(void){
    char arr[12], *ptr;
    int *dest;

    ptr = &arr[0];
    dest = (int*)ptr;
}

Пример - выделение с функцией

#include <stdlib.h>

void *my_alloc(int size) { 
    void *ptr_func = malloc(size); 
    if(ptr_func == NULL) exit(-1); 
    return ptr_func; 
}

void fun_non_align(void){
    int *dest1;
    char *dest2;

    dest1 = (int*)my_alloc(13);  //defect
    dest2 = (char*)my_alloc(13); //not a defect
}

В этом примере программное обеспечение повышает дефект на преобразовании указателя, возвращенного my_alloc(13) к int* в линии 11. my_alloc(13) возвращает указатель с динамически выделенным размером 13 байтов. Размер dest1 4 байта, который не является делителем 13. Это неточное совмещение вызывает Неправильный выделенный размер объекта для дефекта броска. В линии 12, тот же вызов функции, my_alloc(13), не вызывает дефект для преобразования в dest2 потому что размер char*, 1 байт, делитель 13.

Коррекция — изменяет размер указателя

Одна возможная коррекция должна использовать размер указателя, который является кратным целевому размеру. В этом примере разрешите дефект путем изменения аргумента для my_alloc к кратному 4.

#include <stdlib.h>

void *my_alloc(int size) { 
    void *ptr_func = malloc(size); 
    if(ptr_func == NULL) exit(-1); 
    return ptr_func; 
}

void fun_non_align(void){
    int *dest1;
    char *dest2;

    dest1 = (int*)my_alloc(12); 
    dest2 = (char*)my_alloc(13); 
}

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

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.