...
Code Block | ||
---|---|---|
| ||
size_t size = 16; size_t alignment = 1<<121 << 12; float *ptr; double *ptr1; ptr = aligned_alloc(align , size); ptr1 = realloc(ptr, size); |
...
Compliant Solution
This compliant example solution checks that aligned_alloc()
has the same alignment as the alignment realloc()
function enforces on the memory pointed to by ptr
(again assuming that the sizeof(double) = 8
and sizeof(float) = 4
).
Code Block | ||
---|---|---|
| ||
size_t size = 16; size_t alignment = 1<<121 << 12; float *ptr; double *ptr1; ptr = aligned_alloc(align , size); if(align == alignof(ptr1)) { ptr1 = realloc(ptr, size); } |
Implementation Details
Another noncompliant example that has been implemented When compiled with gcc version 4.1.2 and run on the x86_64-redhat-linux platform and compiled with gcc version 4.1.2 is as followsthe following code:
Code Block |
---|
#include<stdlib#include <stdlib.h> #include<stdio#include <stdio.h> int main(void) { size_t size = 10; size_t align = 1 << 12; float *ptr; double *ptr1; posix_memalign((void **)&ptr, align , 4); if ((ptr1 = realloc((int *)ptr, size)) == NULL) { exit(0); } ptr[0] = 12.5; ptr[1] = 25.5; printf("memory aligned to %d bytes\n\n",align); printf("ptr[0] : %p = %f\n",ptr, ptr[0]); printf("ptr[1] : %p = %f\n\n",&ptr[1], ptr[1]); printf("After realloc(): \n"); printf("ptr1[0] : %p = %lf\n",ptr1, ptr[0]); printf("ptr1[1] : %p = %lf\n\n",&ptr1[1], ptr1[1]); printf("The value at ptr[1] remains the same after realloc()\n"); printf("ptr[1] : %p = %f\n",((float *)ptr1+1),*((float *)ptr1+1)); free(ptr1); return 0; } |
The noncompliant example produces the following (unexpected) output.
...
Risk Assessment
Improper alignment could can lead to accessing arbitrary memory locations and write into it.
...