Defect Report #073
Submission Date: 03 Dec 93
Submittor: WG14
Source: Clive Feather
Question
Item 10 - definition of object
Consider the following translation unit:
#include <stdlib.h>
struct complex
{
double real [2];
double imag;
}
#define D_PER_C (sizeof (struct complex) / sizeof (double))
struct complex *f (double x)
{
struct complex *array = malloc(sizeof (struct complex) +
sizeof (double));
struct complex *pc;
double *pd;
if (array == NULL)
return NULL;
array [1].real [0] = x; /* Line A /*
array [1].real [1] = x; /* Line B /*
array [1].imag = x; /* Line C /*
pc = array + 1; /* Line D /*
pc = array + 2; /* Line E /*
pd = &(array [1].real [0]); /* Line F /*
pd = &(array [1].real [1]); /* Line G /*
pd = &(array [1].imag); /* Line H /*
pd = &(array [0].real [0]) + D_PER_C; /* Line I /*
pd = &(array [0].real [1]) + D_PER_C; /* Line J /*
pd = &(array [0].imag) + D_PER_C; /* Line K /*
pd = &(array [0].real [0]) + D_PER_C * 2; /* Line L /*
pd = &(array [0].real [0]) + D_PER_C + 1; /* Line M /*
pd = &(array [0].real [0]) + D_PER_C + 2; /* Line N /*
return array;
}
Subscripting is strictly conforming if the array is ``large enough''
(subclause 6.3.6). For each of the marked lines, is the assignment
strictly conforming?
Response
Lines A, B, C. The identifier array points to an object that
is not large enough to hold two struct complex objects. The
dot selection operator is at liberty to require the complete structure
denoted by its left hand side to be accessed. Such an access would
result in undefined behavior.
Line D. If array is regarded as pointing to a single structure
then creating a pointer to one past the end of that object is permitted.
Line E. If array is regarded as pointing to a single structure
then creating a pointer two past the end of that object is not permitted.
Since there is insufficient storage allocated to create a second struct
complex object, it is not permitted to point one past this partial
struct complex object.
Lines F, G, H. Same analysis as Lines A, B, C.
Lines I, J, K, L, M, N. All of these calculations will result in pointers
that point outside the original object (arrays or structures) and
result in undefined behavior.
Previous Defect Report
< - >
Next Defect Report