mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-09-27 03:54:30 +00:00
Generate valid code for "dereferencing" pointers to void.
This covers code like the following, which is very dubious but does not seem to be clearly prohibited by the standards: int main(void) { void *vp; *vp; } Previously, this would do an indirect load of a four-byte value at the location, but then treat it as void. This could lead to the four-byte value being left on the stack, eventually causing a crash. Now we just evaluate the pointer expression (in case it has side effects), but effectively cast it to void without dereferencing it.
This commit is contained in:
parent
417fd1ad9c
commit
63d33b47bf
@ -4564,7 +4564,7 @@ case tree^.token.kind of
|
|||||||
isVolatile := tqVolatile in lType^.qualifiers;
|
isVolatile := tqVolatile in lType^.qualifiers;
|
||||||
if lType^.kind = scalarType then
|
if lType^.kind = scalarType then
|
||||||
if lType^.baseType = cgVoid then
|
if lType^.baseType = cgVoid then
|
||||||
Gen2t(pc_ind, ord(isVolatile), 0, cgULong)
|
Gen2(pc_cnv, cgULong, cgVoid)
|
||||||
else
|
else
|
||||||
Gen2t(pc_ind, ord(isVolatile), 0, lType^.baseType)
|
Gen2t(pc_ind, ord(isVolatile), 0, lType^.baseType)
|
||||||
else if lType^.kind = pointerType then
|
else if lType^.kind = pointerType then
|
||||||
|
Loading…
Reference in New Issue
Block a user