exponenta event banner

CERT C: MEM36-C правил

Не изменяйте выравнивание объектов путем вызова realloc ()

Описание

Определение правила

Не изменяйте выравнивание объектов путем вызова realloc (). [ 1]

Внедрение Polyspace

Эта проверка проверяет выравнивание, измененное после перераспределения памяти.

Примеры

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

Проблема

Выравнивание изменено после перераспределения памяти при использовании realloc() для изменения размера объектов со строгими требованиями к выравниванию памяти.

Риск

Указатель, возвращенный realloc() может быть соответствующим образом присвоен объектам с менее строгими требованиями к выравниванию. Несогласованное выделение памяти может привести к переполнению или переполнению буфера, неправильному удалению указателя или доступу к произвольным ячейкам памяти. В процессорах, поддерживающих несогласованную память, выделение ресурсов влияет на производительность системы.

Зафиксировать

Для перераспределения памяти:

  1. Измените размер блока памяти.

    • В Windows ® используйте_aligned_realloc() с аргументом выравнивания, используемым в _aligned_malloc() для выделения исходного блока памяти.

    • В UNIX/Linux используйте ту же функцию с тем же аргументом выравнивания, который используется для выделения исходного блока памяти.

  2. Скопируйте исходное содержимое в новый блок памяти.

  3. Освободите исходный блок памяти.

Примечание

Это исправление имеет поведение, определяемое реализацией. Реализация может не поддерживать запрошенное выравнивание памяти и иметь дополнительные ограничения на размер новой памяти.

Пример - Память перераспределена без сохранения исходного выравнивания
#include <stdio.h>
#include <stdlib.h>

#define SIZE1024 1024

void func(void)
{
    size_t resize = SIZE1024;
    size_t alignment = 1 << 12; /* 4096 bytes alignment */
    int *ptr = NULL;
    int *ptr1;

	/* Allocate memory with 4096 bytes alignment */
	
    if (posix_memalign((void **)&ptr, alignment, sizeof(int)) != 0) 
    {
        /* Handle error */      
	  }
	  
	/*Reallocate memory without using the original alignment. 
	ptr1 may not be 4096 bytes aligned. */
		
    ptr1 = (int *)realloc(ptr, sizeof(int) * resize);
	
    if (ptr1 == NULL)
    {
        /* Handle error */
    }

    /* Processing using ptr1 */

    /* Free before exit */
    free(ptr1);
}

        
      

В этом примере выделенная память выровнена на 4096 байт. realloc() затем изменяет размер выделенной памяти. Новый указатель ptr1 не может быть выровнено на 4096 байт.

Коррекция - задание выравнивания для перераспределенной памяти

При перераспределении памяти используйте posix_memalign() и передайте аргумент выравнивания, который использовался для выделения исходной памяти.

#include <stdio.h>
#include <stdlib.h>

#define SIZE1024 1024

void func(void)
{
    size_t resize = SIZE1024;
    size_t alignment = 1 << 12; /* 4096 bytes alignment */
    int *ptr = NULL;

	/* Allocate memory with 4096 bytes alignment */
    if (posix_memalign((void **)&ptr, alignment, sizeof(int)) != 0) 
    {
        /* Handle error */
    }
	
	/* Reallocate memory using the original alignment. */
    if (posix_memalign((void **)&ptr, alignment, sizeof(int) * resize) != 0) 
    {
        /* Handle error */
        free(ptr);
        ptr = NULL;
    }

    /* Processing using ptr */

    /* Free before exit */
    free(ptr);
}  

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

Группа: Правило 08. Управление памятью (MEM)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.