[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