[LLVMdev] Language lawyer question

Dale Johannesen dalej at apple.com
Tue Mar 11 20:42:56 PDT 2008


Looking through the gcc testsuite turned up an interesting edge case.   
Let's assume our target leaves a hole for alignment in struct x, as do  
x86 and powerpc.  Do you think the following code can validly abort?

   struct x { char c; short s; };
   int i;    char *p;
   memset(&X, 0, sizeof(struct x));
   memset(&Y, 22, sizeof(struct x));
   X = Y;
   for (i=0, p=(char *)&X; i<sizeof(struct x); i++, p++)
     if (*p != 22)
       abort();

The memset's and char-by-char comparison are clearly valid references;  
the questionable bit is the struct copy, which llvm-gcc currently does  
field-by-field, skipping the hole.  C99 says

In simple assignment (=), the value of the right operand is converted  
to the type of the
assignment expression and replaces the value stored in the object  
designated by the left
operand.

I would take "replaces the value" to mean "replaces the entire value",  
but it could be read otherwise, I suppose.

The current code seems to me to assume holes in structs can't ever be  
validly accessed, which isn't right, as we see here.  They are often  
nondeterministic (this is explicit for initialization in C99) but not  
always.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080311/85880817/attachment.html>


More information about the llvm-dev mailing list