[fpc-devel] TypeInfo GetSetProp and GetEnumName

Martin Frb lazarus at mfriebe.de
Thu May 20 19:00:21 CEST 2021


Looking through some code in unit TypInfo
in relation to https://bugs.freepascal.org/view.php?id=38915

RTTI for a set, only specifies the size in bytes. (TTypeDate.SetSize)
GetSetProp / SetToString
iterate over all bits on the given byte size.
Since in many cases this is more than the actual amount of elements in 
the set, those function relay on the unused bits to be always zero.  
(Which is probably always a given / pointer hacks and uninitialized 
excluded).

GetEnumName when (if the unused bits were to contain a 1) called with a 
value greater than the enums, would gladly iterate behind its NameList.
And in doing so, could leave the applications memory space (though 
unlikely, as the enum rtti would need to be just before the end of mem 
assigned to the app).

GetEnumName  does
- neither check the TTypeData.MaxValue,
- nor does it check for the terminating nil  (see below)

Is that indented?
Or should GetEnumName have some checks?


----------------
on the RTTI for enums

fpc_3.2.2\source\compiler\ncgrtti.pas
procedure enumdef_rtti(def: tenumdef);
line 990;
           { write zero which is required by RTL }
           tcb.emit_ord_const(0,u8inttype);

Out of interest: That call is inside a (several) tcb.begin_anonymous_record
I would therefore expect (target depended) that "u8inttype" may be aligned?

I have not (yet) found where this zero value is actually used.

But if it might be aligned, I am curious, because it ends a list of 
shortstring.
Therefore any code, after iterating over the last such shortstring would 
likely be at an unaligned location, and not necessary at the zero qword?
On the other hand, it might be padding, never to be used, just to ensure 
the existence of valid/accessible memory?
In the latter case of course this would not prevent any over-read by 
SetToString on a dirty set value.





More information about the fpc-devel mailing list