On Thursday 11 September 2008 23.18:07 Florian Klaempfl wrote:
> Martin Schreiber schrieb:
> > On Saturday 30 August 2008 13.37:42 Florian Klaempfl wrote:
> >
> > I have a crash in MSEide startup in a procedure finalization section:
[...]
> > I saw that you merged unicodestring to trunk. Should I test with trunk
> > instead of unicodestring branch?
>
> Yes. Unicodestring branch is closed.

I tried with trunk, same result. The problem is probably that the second 
constant string parameter has a wrong reference count. It is initially 0 
instead of -1. The incref call at begin of winfilepath turns it to 1, decref 
in finalize section of winfilepath tries to free the constant string 
memory -> bumm.
Testresult:
"
-1
1
An unhandled exception occurred at $77892373 :
EAccessViolation : Access violation
  $77892373
  $778922F8
  $0040A214
  $004097A3
  $004098DD
  $004099DB
  $00408844
  $004068EA
  $0040696D
  $00401858
  $004018D5
"
The crash stack:
"
#0  77892373 :0 ??()
#1  00416E04 :0 U_SYSTEM_ENTRYINFORMATION()
#2  004196D4 :0 U_SYSINITPAS_ENTRYINFORMATION()
#3  004162C4 :0 U_SYSTEM_OUTPUT()
#4  014CFE20 :0 ??()
#5  00408799 sysheap.inc:38 SYSOSALLOC(SIZE=0)
#6  778922F8 sysheap.inc:0 ??()
#7  00416F00 sysheap.inc:0 U_SYSTEM_ORPHANED_FREELISTS()
#8  0040A762 systhrd.inc:300 SYSENTERCRITICALSECTION(CS=void)
#9  0040A214 thread.inc:190 ENTERCRITICALSECTION(CS={DEBUGINFO = 0x0, 
LOCKCOUNT = 1, RECURSIONCOUNT = 0, OWNINGTHREAD = 0, LOCKSEMAPHORE = 944, 
SPINCOUNT = 0})
#10  004097A3 heap.inc:1034 WAITFREE_VAR(PMCV=0x41312c)
#11  004098DD heap.inc:1086 SYSFREEMEM_VAR(LOC_FREELISTS=0x416f84, 
PMCV=0x41312c)
#12  004099DB heap.inc:1125 SYSFREEMEM(P=0x413138)
#13  00408844 heap.inc:275 FREEMEM(P=0x413138)
#14  004068EA ustrings.inc:179 DISPOSEUNICODESTRING(S=0x413138)
#15  0040696D ustrings.inc:206 fpc_unicodestr_decr_ref(S=0x413138)
#16  00401858 decrefcrash.pas:63 WINFILEPATH(DIRNAME=0x0, FILENAME=0x413138, 
result=0x14fdab0)
#17  004018D5 decrefcrash.pas:69 main()
"
And there are calls to fpc_WideStr_Decr_Ref I don't understand.
Test program attached.

Martin
program decrefcrash;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
{$ifdef mswindows}{$apptype console}{$endif}
uses
 {$ifdef FPC}{$ifdef linux}cthreads,{$endif}{$endif}
 sysutils;

const
 maxdatasize = $7fffffff; 
type
 msechar = unicodechar;
 msestring = unicodestring;
 msecharaty = array[0..maxdatasize div sizeof(msechar)-1] of msechar;
 pmsecharaty = ^msecharaty;

procedure replacechar1(var dest: msestring; a,b: msechar);
  //replaces a by b
var
 int1: integer;
begin
 uniquestring(dest);
 for int1:= 0 to length(dest)-1 do begin
  if pmsecharaty(dest)^[int1] = a then begin
   pmsecharaty(dest)^[int1]:= b;
  end;
 end;
end;


function winfilepath(dirname,filename: msestring): msestring;
begin
 writeln((pptrint(pointer(dirname))-2)^);
 flush(output);
 writeln((pptrint(pointer(filename))-2)^);
 flush(output);
 replacechar1(dirname,msechar('/'),msechar('\'));
 replacechar1(filename,msechar('/'),msechar('\'));
 if (length(dirname) >= 3) and (dirname[1] = '\') and (dirname[3] = ':') then begin
  dirname[1]:= dirname[2]; // '/c:' -> 'c:\'
  dirname[2]:= ':';
  dirname[3]:= '\';
  if (dirname[4] = '\') and (length(dirname) > 4) then begin
   move(dirname[5],dirname[4],(length(dirname) - 4)*sizeof(msechar));
   setlength(dirname,length(dirname) - 1);
  end;
 end;
 if filename <> '' then begin
  if dirname = '' then begin
   result:= '.\'+filename;
  end
  else begin
   if dirname[length(dirname)] <> '\' then begin
    result:= dirname + '\' + filename;
   end
   else begin
    result:= dirname + filename;
   end;
  end;
 end
 else begin
  result:= dirname;
 end;
end;

var
 mstr1,mstr2: msestring;
begin
 mstr2:= 'C:\Dokumente und Einstellungen\mseca\Anwendungsdaten\.mseide';
 mstr1:= winfilepath(mstr2,'*');
end.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to