Преобразование значений указателя к более строго выровненным типам указателей
Неправильно выделенный размер объекта для броска происходит во время преобразования указателя, когда адрес указателя неправильно выравнивается. Если указатель преобразован в различный тип указателя, размер выделенной памяти должен быть кратным размеру целевого указателя.
Разыменование неправильно выровненного указателя имеет неопределенное поведение и может заставить вашу программу отказывать.
Предположим, что вы преобразуете указатель 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); }
Разрешимость: неразрешимый |
[1] Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.