Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
bgColor#ffcccc
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
bgColor#ccccff
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.

...