mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 23:49:22 +02:00
* fixed tw4554:
* proper uninitialized checking for arrays * first check uninitialized status of right side of assignment before setting the left side to "written" (-> catch "x:=x" if x is uninitialized) git-svn-id: trunk@2038 -
This commit is contained in:
parent
84aab46550
commit
857664a5d4
@ -773,8 +773,11 @@ implementation
|
|||||||
vecn:
|
vecn:
|
||||||
begin
|
begin
|
||||||
set_varstate(tbinarynode(p).right,vs_read,[vsf_must_be_valid]);
|
set_varstate(tbinarynode(p).right,vs_read,[vsf_must_be_valid]);
|
||||||
if not(tunarynode(p).left.resulttype.def.deftype in [stringdef,arraydef]) then
|
if (newstate in [vs_read,vs_readwritten]) or
|
||||||
include(varstateflags,vsf_must_be_valid);
|
not(tunarynode(p).left.resulttype.def.deftype in [stringdef,arraydef]) then
|
||||||
|
include(varstateflags,vsf_must_be_valid)
|
||||||
|
else if (newstate = vs_written) then
|
||||||
|
exclude(varstateflags,vsf_must_be_valid);
|
||||||
p:=tunarynode(p).left;
|
p:=tunarynode(p).left;
|
||||||
end;
|
end;
|
||||||
{ do not parse calln }
|
{ do not parse calln }
|
||||||
|
@ -564,8 +564,8 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
resulttypepass(right);
|
resulttypepass(right);
|
||||||
set_varstate(left,vs_written,[]);
|
|
||||||
set_varstate(right,vs_read,[vsf_must_be_valid]);
|
set_varstate(right,vs_read,[vsf_must_be_valid]);
|
||||||
|
set_varstate(left,vs_written,[]);
|
||||||
if codegenerror then
|
if codegenerror then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
@ -443,9 +443,12 @@ implementation
|
|||||||
|
|
||||||
{ this is like the function addr }
|
{ this is like the function addr }
|
||||||
inc(parsing_para_level);
|
inc(parsing_para_level);
|
||||||
{ this is actually only "read", but treat it nevertheless as modified }
|
{ This is actually only "read", but treat it nevertheless as }
|
||||||
{ due to the possible use of pointers }
|
{ modified due to the possible use of pointers }
|
||||||
set_varstate(left,vs_readwritten,[]);
|
{ To avoid false positives regarding "uninitialised" }
|
||||||
|
{ warnings when using arrays, perform it in two steps }
|
||||||
|
set_varstate(left,vs_written,[]);
|
||||||
|
set_varstate(left,vs_read,[]);
|
||||||
dec(parsing_para_level);
|
dec(parsing_para_level);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -660,11 +663,16 @@ implementation
|
|||||||
ansi/widestring needs to be valid }
|
ansi/widestring needs to be valid }
|
||||||
valid:=is_dynamic_array(left.resulttype.def) or
|
valid:=is_dynamic_array(left.resulttype.def) or
|
||||||
is_ansistring(left.resulttype.def) or
|
is_ansistring(left.resulttype.def) or
|
||||||
is_widestring(left.resulttype.def);
|
is_widestring(left.resulttype.def) or
|
||||||
|
{ implicit pointer dereference -> pointer is read }
|
||||||
|
(left.resulttype.def.deftype = pointerdef);
|
||||||
if valid then
|
if valid then
|
||||||
set_varstate(left,vs_read,[vsf_must_be_valid])
|
set_varstate(left,vs_read,[vsf_must_be_valid]);
|
||||||
else
|
{
|
||||||
set_varstate(left,vs_read,[]);
|
A vecn is, just like a loadn, always part of an expression with its
|
||||||
|
own read/write and must_be_valid semantics. Therefore we don't have
|
||||||
|
to do anything else here, just like for loadn's
|
||||||
|
}
|
||||||
set_varstate(right,vs_read,[vsf_must_be_valid]);
|
set_varstate(right,vs_read,[vsf_must_be_valid]);
|
||||||
if codegenerror then
|
if codegenerror then
|
||||||
exit;
|
exit;
|
||||||
|
Loading…
Reference in New Issue
Block a user