* low-highval always checked if limit ober 2GB is reached (to avoid overflow)

This commit is contained in:
carl 2002-09-27 21:13:28 +00:00
parent ab9e07a2d7
commit f3d9f997cd
7 changed files with 82 additions and 43 deletions

View File

@ -857,7 +857,7 @@ implementation
if not assigned(htype.def) then if not assigned(htype.def) then
htype:=voidtype; htype:=voidtype;
resulttype.setdef(tarraydef.create(0,len-1,s32bittype)); resulttype.setdef(tarraydef.create(0,len-1,s32bittype));
tarraydef(resulttype.def).elementtype:=htype; tarraydef(resulttype.def).setelementtype(htype);
tarraydef(resulttype.def).IsConstructor:=true; tarraydef(resulttype.def).IsConstructor:=true;
tarraydef(resulttype.def).IsVariant:=varia; tarraydef(resulttype.def).IsVariant:=varia;
end; end;
@ -867,7 +867,7 @@ implementation
var var
hp : tarrayconstructornode; hp : tarrayconstructornode;
begin begin
tarraydef(resulttype.def).elementtype:=tt; tarraydef(resulttype.def).setelementtype(tt);
tarraydef(resulttype.def).IsConstructor:=true; tarraydef(resulttype.def).IsConstructor:=true;
tarraydef(resulttype.def).IsVariant:=false; tarraydef(resulttype.def).IsVariant:=false;
if assigned(left) then if assigned(left) then
@ -1144,7 +1144,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.59 2002-09-26 15:02:05 florian Revision 1.60 2002-09-27 21:13:28 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.59 2002/09/26 15:02:05 florian
+ support of passing variants to "array of const" + support of passing variants to "array of const"
Revision 1.58 2002/09/07 15:25:03 peter Revision 1.58 2002/09/07 15:25:03 peter

View File

@ -751,7 +751,7 @@ implementation
begin begin
{ convert pointer to array } { convert pointer to array }
htype.setdef(tarraydef.create(0,$7fffffff,s32bittype)); htype.setdef(tarraydef.create(0,$7fffffff,s32bittype));
tarraydef(htype.def).elementtype:=tpointerdef(left.resulttype.def).pointertype; tarraydef(htype.def).setelementtype(tpointerdef(left.resulttype.def).pointertype);
inserttypeconv(left,htype); inserttypeconv(left,htype);
resulttype:=tarraydef(htype.def).elementtype; resulttype:=tarraydef(htype.def).elementtype;
@ -1057,7 +1057,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.39 2002-09-01 18:44:17 peter Revision 1.40 2002-09-27 21:13:28 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.39 2002/09/01 18:44:17 peter
* cleanup of tvecnode.det_resulttype * cleanup of tvecnode.det_resulttype
* move 0 element of string access check to resulttype * move 0 element of string access check to resulttype

View File

@ -225,6 +225,7 @@ implementation
varspez : tvarspez; varspez : tvarspez;
s : string; s : string;
tt : ttype; tt : ttype;
arraytype : ttype;
declarepos : tfileposinfo; declarepos : tfileposinfo;
pp : Tprocdef; pp : Tprocdef;
pd : tprocdef; pd : tprocdef;
@ -297,7 +298,8 @@ implementation
{ define range and type of range } { define range and type of range }
tt.setdef(tarraydef.create(0,-1,s32bittype)); tt.setdef(tarraydef.create(0,-1,s32bittype));
{ define field type } { define field type }
single_type(tarraydef(tt.def).elementtype,s,false); single_type(arraytype,s,false);
tarraydef(tt.def).setelementtype(arraytype);
end end
else else
single_type(tt,s,false); single_type(tt,s,false);
@ -1150,7 +1152,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.52 2002-09-16 14:11:13 peter Revision 1.53 2002-09-27 21:13:28 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.52 2002/09/16 14:11:13 peter
* add argument to equal_paras() to support default values or not * add argument to equal_paras() to support default values or not
Revision 1.51 2002/09/09 17:34:15 peter Revision 1.51 2002/09/09 17:34:15 peter

View File

@ -105,6 +105,7 @@ implementation
sc : tsinglelist; sc : tsinglelist;
htype, htype,
tt : ttype; tt : ttype;
arrayelementtype : ttype;
hvs, hvs,
vs : tvarsym; vs : tvarsym;
srsym : tsym; srsym : tsym;
@ -218,13 +219,14 @@ implementation
srsym:=searchsymonlyin(systemunit,'TVARREC'); srsym:=searchsymonlyin(systemunit,'TVARREC');
if not assigned(srsym) then if not assigned(srsym) then
InternalError(1234124); InternalError(1234124);
tarraydef(tt.def).elementtype:=ttypesym(srsym).restype; tarraydef(tt.def).setelementtype(ttypesym(srsym).restype);
tarraydef(tt.def).IsArrayOfConst:=true; tarraydef(tt.def).IsArrayOfConst:=true;
end end
else else
begin begin
{ define field type } { define field type }
single_type(tarraydef(tt.def).elementtype,hs1,false); single_type(arrayelementtype,hs1,false);
tarraydef(tt.def).setelementtype(arrayelementtype);
end; end;
inserthigh:=true; inserthigh:=true;
end end
@ -1989,7 +1991,10 @@ const
end. end.
{ {
$Log$ $Log$
Revision 1.75 2002-09-16 14:11:13 peter Revision 1.76 2002-09-27 21:13:29 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.75 2002/09/16 14:11:13 peter
* add argument to equal_paras() to support default values or not * add argument to equal_paras() to support default values or not
Revision 1.74 2002/09/10 16:27:28 peter Revision 1.74 2002/09/10 16:27:28 peter

View File

@ -192,12 +192,12 @@ implementation
vmtsymtable.insert(tvarsym.create('$length',s32bittype)); vmtsymtable.insert(tvarsym.create('$length',s32bittype));
vmtsymtable.insert(tvarsym.create('$mlength',s32bittype)); vmtsymtable.insert(tvarsym.create('$mlength',s32bittype));
vmtarraytype.setdef(tarraydef.create(0,1,s32bittype)); vmtarraytype.setdef(tarraydef.create(0,1,s32bittype));
tarraydef(vmtarraytype.def).elementtype:=voidpointertype; tarraydef(vmtarraytype.def).setelementtype(voidpointertype);
vmtsymtable.insert(tvarsym.create('$__pfn',vmtarraytype)); vmtsymtable.insert(tvarsym.create('$__pfn',vmtarraytype));
addtype('$__vtbl_ptr_type',vmttype); addtype('$__vtbl_ptr_type',vmttype);
addtype('$pvmt',pvmttype); addtype('$pvmt',pvmttype);
vmtarraytype.setdef(tarraydef.create(0,1,s32bittype)); vmtarraytype.setdef(tarraydef.create(0,1,s32bittype));
tarraydef(vmtarraytype.def).elementtype:=pvmttype; tarraydef(vmtarraytype.def).setelementtype(pvmttype);
addtype('$vtblarray',vmtarraytype); addtype('$vtblarray',vmtarraytype);
{ Add functions that require compiler magic } { Add functions that require compiler magic }
insertinternsyms(p); insertinternsyms(p);
@ -283,7 +283,7 @@ implementation
{ length=0 for shortstring is open string (needed for readln(string) } { length=0 for shortstring is open string (needed for readln(string) }
openshortstringtype.setdef(tstringdef.createshort(0)); openshortstringtype.setdef(tstringdef.createshort(0));
openchararraytype.setdef(tarraydef.create(0,-1,s32bittype)); openchararraytype.setdef(tarraydef.create(0,-1,s32bittype));
tarraydef(openchararraytype.def).elementtype:=cchartype; tarraydef(openchararraytype.def).setelementtype(cchartype);
{$ifdef x86} {$ifdef x86}
{$ifdef i386} {$ifdef i386}
ordpointertype:=u32bittype; ordpointertype:=u32bittype;
@ -469,7 +469,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.39 2002-09-07 20:46:10 carl Revision 1.40 2002-09-27 21:13:29 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.39 2002/09/07 20:46:10 carl
* cardinal -> longword * cardinal -> longword
Revision 1.38 2002/08/23 13:11:11 mazen Revision 1.38 2002/08/23 13:11:11 mazen

View File

@ -445,7 +445,7 @@ implementation
read_type(tt2,''); read_type(tt2,'');
{ if no error, set element type } { if no error, set element type }
if assigned(ap) then if assigned(ap) then
ap.elementtype:=tt2; ap.setelementtype(tt2);
end; end;
var var
@ -640,7 +640,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.44 2002-09-10 16:26:39 peter Revision 1.45 2002-09-27 21:13:29 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.44 2002/09/10 16:26:39 peter
* safety check for typesym added for incomplete type def check * safety check for typesym added for incomplete type def check
Revision 1.43 2002/09/09 19:34:07 peter Revision 1.43 2002/09/09 19:34:07 peter

View File

@ -340,18 +340,21 @@ interface
rangenr : longint; rangenr : longint;
lowrange, lowrange,
highrange : longint; highrange : longint;
elementtype,
rangetype : ttype; rangetype : ttype;
IsDynamicArray, IsDynamicArray,
IsVariant, IsVariant,
IsConstructor, IsConstructor,
IsArrayOfConst : boolean; IsArrayOfConst : boolean;
protected
_elementtype : ttype;
public
function elesize : longint; function elesize : longint;
constructor create(l,h : longint;const t : ttype); constructor create(l,h : longint;const t : ttype);
constructor ppuload(ppufile:tcompilerppufile); constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override; procedure ppuwrite(ppufile:tcompilerppufile);override;
function gettypename:string;override; function gettypename:string;override;
function getmangledparaname : string;override; function getmangledparaname : string;override;
procedure setelementtype(t: ttype);
{$ifdef GDB} {$ifdef GDB}
function stabstring : pchar;override; function stabstring : pchar;override;
procedure concatstabto(asmlist : taasmoutput);override; procedure concatstabto(asmlist : taasmoutput);override;
@ -368,6 +371,7 @@ interface
function needs_inittable : boolean;override; function needs_inittable : boolean;override;
procedure write_child_rtti_data(rt:trttitype);override; procedure write_child_rtti_data(rt:trttitype);override;
procedure write_rtti_data(rt:trttitype);override; procedure write_rtti_data(rt:trttitype);override;
property elementtype : ttype Read _ElementType;
end; end;
torddef = class(tstoreddef) torddef = class(tstoreddef)
@ -2590,7 +2594,7 @@ implementation
inherited ppuloaddef(ppufile); inherited ppuloaddef(ppufile);
deftype:=arraydef; deftype:=arraydef;
{ the addresses are calculated later } { the addresses are calculated later }
ppufile.gettype(elementtype); ppufile.gettype(_elementtype);
ppufile.gettype(rangetype); ppufile.gettype(rangetype);
lowrange:=ppufile.getlongint; lowrange:=ppufile.getlongint;
highrange:=ppufile.getlongint; highrange:=ppufile.getlongint;
@ -2641,7 +2645,7 @@ implementation
procedure tarraydef.deref; procedure tarraydef.deref;
begin begin
inherited deref; inherited deref;
elementtype.resolve; _elementtype.resolve;
rangetype.resolve; rangetype.resolve;
end; end;
@ -2649,7 +2653,7 @@ implementation
procedure tarraydef.ppuwrite(ppufile:tcompilerppufile); procedure tarraydef.ppuwrite(ppufile:tcompilerppufile);
begin begin
inherited ppuwritedef(ppufile); inherited ppuwritedef(ppufile);
ppufile.puttype(elementtype); ppufile.puttype(_elementtype);
ppufile.puttype(rangetype); ppufile.puttype(rangetype);
ppufile.putlongint(lowrange); ppufile.putlongint(lowrange);
ppufile.putlongint(highrange); ppufile.putlongint(highrange);
@ -2663,7 +2667,7 @@ implementation
function tarraydef.stabstring : pchar; function tarraydef.stabstring : pchar;
begin begin
stabstring := strpnew('ar'+tstoreddef(rangetype.def).numberstring+';' stabstring := strpnew('ar'+tstoreddef(rangetype.def).numberstring+';'
+tostr(lowrange)+';'+tostr(highrange)+';'+tstoreddef(elementtype.def).numberstring); +tostr(lowrange)+';'+tostr(highrange)+';'+tstoreddef(_elementtype.def).numberstring);
end; end;
@ -2673,7 +2677,7 @@ implementation
and (is_def_stab_written = not_written) then and (is_def_stab_written = not_written) then
begin begin
{when array are inserted they have no definition yet !!} {when array are inserted they have no definition yet !!}
if assigned(elementtype.def) then if assigned(_elementtype.def) then
inherited concatstabto(asmlist); inherited concatstabto(asmlist);
end; end;
end; end;
@ -2682,7 +2686,7 @@ implementation
function tarraydef.elesize : longint; function tarraydef.elesize : longint;
begin begin
elesize:=elementtype.def.size; elesize:=_elementtype.def.size;
end; end;
@ -2696,31 +2700,41 @@ implementation
size:=POINTER_SIZE; size:=POINTER_SIZE;
exit; exit;
end; end;
cachedsize := elesize;
{Tarraydef.size may never be called for an open array!} {Tarraydef.size may never be called for an open array!}
if highrange<lowrange then if highrange<lowrange then
internalerror(99080501); internalerror(99080501);
cachedsize := elesize; newsize:=(int64(highrange)-int64(lowrange)+1)*cachedsize;
If (cachedsize>0) and If (cachedsize>0) and
( (
(TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) or (TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) or
{ () are needed around elesize-1 to avoid a possible { () are needed around elesize-1 to avoid a possible
integer overflow for elesize=1 !! PM } integer overflow for elesize=1 !! PM }
(($7fffffff div cachedsize + (cachedsize -1)) < (int64(highrange) - int64(lowrange))) (($7fffffff div cachedsize + (cachedsize -1)) < (int64(highrange) - int64(lowrange)))
) Then ) Then
Begin Begin
Message(sym_e_segment_too_large); Message(sym_e_segment_too_large);
size := 4 size:=4;
End
Else
begin
newsize:=(int64(highrange)-int64(lowrange)+1)*cachedsize;
{ prevent an overflow }
if newsize>high(longint) then
size:=high(longint)
else
size:=newsize;
end end
else
{ prevent an overflow }
if newsize>high(longint) then
size:=high(longint)
else
size:=newsize;
end; end;
procedure tarraydef.setelementtype(t: ttype);
var
cachedsize: TConstExprInt;
begin
_elementtype:=t;
If IsDynamicArray then
exit;
if (TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) then
Message(sym_e_segment_too_large);
end;
function tarraydef.alignment : longint; function tarraydef.alignment : longint;
@ -5542,7 +5556,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.95 2002-09-16 09:31:10 florian Revision 1.96 2002-09-27 21:13:29 carl
* low-highval always checked if limit ober 2GB is reached (to avoid overflow)
Revision 1.95 2002/09/16 09:31:10 florian
* fixed currency size * fixed currency size
Revision 1.94 2002/09/09 17:34:15 peter Revision 1.94 2002/09/09 17:34:15 peter