Jelajahi Sumber

* fixed an error with trashing (-gt) of open shortstring "out" parameters
causing crashes if strings with a maximum length < 255 were passed

git-svn-id: trunk@13558 -

Jonas Maebe 16 tahun lalu
induk
melakukan
125b9e79d7
3 mengubah file dengan 33 tambahan dan 3 penghapusan
  1. 1 0
      .gitattributes
  2. 8 3
      compiler/ncgutil.pas
  3. 24 0
      tests/tbs/tb0564.pp

+ 1 - 0
.gitattributes

@@ -7574,6 +7574,7 @@ tests/tbs/tb0559.pp svneol=native#text/plain
 tests/tbs/tb0560.pp svneol=native#text/plain
 tests/tbs/tb0561a.pp svneol=native#text/plain
 tests/tbs/tb0561b.pp svneol=native#text/plain
+tests/tbs/tb0564.pp svneol=native#text/plain
 tests/tbs/tb205.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
 tests/tbs/ub0069.pp svneol=native#text/plain

+ 8 - 3
compiler/ncgutil.pas

@@ -1029,7 +1029,7 @@ implementation
                        tlocalvarsym(p).getsize)
                    else
                      { may be an open string, even if is_open_string() returns }
-                     { false for some helpers in the system unit               }
+                     { false (for some helpers in the system unit)             }
                      { an open string has at least size 2                      }
                      trash_reference(list,tabstractnormalvarsym(p).initialloc.reference,
                        2);
@@ -1235,7 +1235,12 @@ implementation
                         { needs separate implementation to trash open arrays }
                         { since their size is only known at run time         }
                         not is_special_array(tparavarsym(p).vardef) then
-                       trash_reference(list,href,tparavarsym(p).vardef.size);
+                        { may be an open string, even if is_open_string() returns }
+                        { false (for some helpers in the system unit)             }
+                       if not is_shortstring(tparavarsym(p).vardef) then
+                         trash_reference(list,href,tparavarsym(p).vardef.size)
+                       else
+                         trash_reference(list,href,2);
                      if needs_inittable then
                        cg.g_initialize(list,tparavarsym(p).vardef,href);
                    end;
@@ -1253,7 +1258,7 @@ implementation
                      reference_reset_base(href,tmpreg,0,
                        used_align(tparavarsym(p).vardef.alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax));
                      { may be an open string, even if is_open_string() returns }
-                     { false for some helpers in the system unit               }
+                     { false (for some helpers in the system unit)             }
                      if not is_shortstring(tparavarsym(p).vardef) then
                        trash_reference(list,href,tparavarsym(p).vardef.size)
                      else

+ 24 - 0
tests/tbs/tb0564.pp

@@ -0,0 +1,24 @@
+{ %opt=-gttt }
+{$mode objfpc}
+
+
+procedure get(out s: string);
+begin
+end;
+
+procedure test;
+var
+  s: string[1];
+  a,b: byte;
+begin
+  a:=1;
+  b:=2;
+  get(s);
+  if (a<>1) or
+     (b<>2) then
+    halt(1);
+end;
+
+begin
+  test;
+end.