[LLVMbugs] [Bug 13346] New: memory corruption with casts to union values
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Thu Jul 12 15:33:31 PDT 2012
http://llvm.org/bugs/show_bug.cgi?id=13346
Bug #: 13346
Summary: memory corruption with casts to union values
Product: clang
Version: 3.1
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P
Component: -New Bugs
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: vk at vedantk.com
CC: llvmbugs at cs.uiuc.edu
Classification: Unclassified
Suppose you have a union with members of different sizes. If you try to cast a
value of a smaller type to the union type, clang allows some memory surrounding
the smaller value to enter the union.
Technically, C99 forbids casts to union values, but gcc handles this case
correctly.
Here is a test case;
#include <stdint.h>
#include <assert.h>
union value {
uint32_t a;
uint64_t b;
};
void test1() {
uint32_t x = 0x12341234;
uint32_t y = 0xffffffff;
union value v = ((union value) y);
assert(v.a == 0xffffffff); /* OK */
assert(v.b == 0x00000000ffffffff); /* gcc OK, but clang fails */
union value z = *((union value*) &y);
assert(z.a == 0xffffffff); /* OK */
assert(z.b == 0x12341234ffffffff); /* Expected result */
assert(z.b == 0x00000000ffffffff); /* (both compilers expected to fail, and
do) */
}
int main() {
test1();
return 0;
}
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list