Results 1 to 6 of 6

Thread: Exception error sinds Delphi 11.2 (x64)

  1. #1
    Senior Member pcoenen's Avatar
    Join Date
    Apr 2001
    Location
    Tesssenderlo, België
    Posts
    239

    Question Exception error sinds Delphi 11.2 (x64)

    Momenteel bezig met de migratie van Delphi 10.3.3 naar Delphi 11.2. In mijn applicatie maak ik gebruik van IPC via de open source code van cromis.net (website spijtig genoeg niet meer bereikbaar). Werkte prima onder Delphi 10.3.3 (x86 en x64).

    Het probleem doet zich enkel voor onder x64 en geeft een exception in onderstaande Hash_SuperFastHash function. Als ik in deze function
    Code:
    Cardinal(Data)
    wijzig door
    Code:
    NativeUInt(Data)
    dan werkt het terug. Ik begrijp alleen niet waarom het wel werkte onder Delphi 10.3.3 (x64) en nu plots niet meer.


    Kan iemand me a.u.b uitleggen wat het volgende stukje code doet:

    Code:
    Data := Pointer(Cardinal(Data) + SizeOf(Word));
    Groeten,
    Pascal


    Code:
    function Hash_SuperFastHash(Data: Pointer; const Length: Cardinal): Cardinal;
    var
      TempPart: Cardinal;
      RemainingBytes: Integer;
      RemainingDWords: Integer;
    begin
      if not Assigned(Data) or (Length <= 0) then
      begin
        Result := 0;
        Exit;
      end;
      Result := Length;
      RemainingBytes := Length and 3; // mod 4
      RemainingDWords := Length shr 2; // div 4
    
      // main loop
      while RemainingDWords > 0 do
      begin
        Result := Result + PWord(Data)^;
        // splitting the pointer math keeps the amount of registers pushed at 2
        Data := Pointer(Cardinal(Data) + SizeOf(Word));
        TempPart := (PWord(Data)^ shl 11) xor Result;
        Result := (Result shl 16) xor TempPart;
        Data  := Pointer(Cardinal(Data) + SizeOf(Word));
        Result := Result + (Result shr 11);
        Dec(RemainingDWords);
      end;
      // Handle end cases
      if RemainingBytes = 3 then
      begin
        Result := Result + PWord(Data)^;
        Result := Result xor (Result shl 16);
        Data  := Pointer(Cardinal(Data) + SizeOf(Word)); // skip to the last byte
        Result := Result xor ((PByte(Data)^ shl 18));
        Result := Result + (Result shr 11);
      end
      else if RemainingBytes = 2 then
      begin
        Result := Result +  PWord(Data)^;
        Result := Result xor (Result shl 11);
        Result := Result + (Result shr 17);
      end
      else if RemainingBytes = 1 then
      begin
        Result := Result + PByte(Data)^;
        Result := Result xor (Result shl 10);
        Result := Result + (Result shr 1);
      end;
      // Force "avalanching" of final 127 bits
      Result := Result xor (Result shl 3);
      Result := Result +   (Result shr 5);
      Result := Result xor (Result shl 4);
      Result := Result +   (Result shr 17);
      Result := Result xor (Result shl 25);
      Result := Result +   (Result shr 6);
    end;

  2. #2
    Heb je de patch van 11.2 geïnstalleerd? Er was een probleem met Windows 64 bit.

  3. #3
    Senior Member pcoenen's Avatar
    Join Date
    Apr 2001
    Location
    Tesssenderlo, België
    Posts
    239
    Bedankt voor je reply en ja deze is geïnstalleerd.

    Ter info, ik kreeg ook een exception op een stukje code van Jedi JCL. Deze (Jedi JCL en JVCL) had ik via GetIt geïnstalleerd. Vervolgens verwijderd en de laatste versie vanuit GitHub geïnstalleerd en hiermee was dit probleem dan ook opgelost. Is er een manier om vanuit GetIt de laatste versie van bv JCL / JVCL te installeren. Ik bedoel, hoe weet je met GetIt packages of er een update beschikbaar is?

  4. #4
    Cardinal lijkt mij in ieder geval een verkeerde cast.
    Die is 32 bit onder beide 32 en 64 bit.

    Uit de documentatie van FPC (en dat zal ook voor Delphi gelden).
    However, because of 32 and 64 bit little endian systems, using the Cardinal type is not recommended anymore for memory/pointer operations/arithmetic. It's recommended to use NativeInt or NativeUInt types instead. These types will match the width of the CPU registers which can be used to encode a memory address and so will always be the right size. For example under a 64b-bit OS, a NativeUInt will be like a UInt64 or a QuadWord and under a 32-bit OS, a NativeUInt will be like a DWord or a Cardinal.
    En
    The size of Cardinal is 32 bits across all 64-bit and 32-bit platforms.
    Als je te maken hebt met geheugen onder 4GB range dan zal de cardinal cast geen probleem opleveren. Kom je daarboven dan werkt die cast dus niet meer juist. Dat kan de reden zijn waarom het voorheen onder 64bit (soms) wel goed gewerkt heeft.
    Last edited by rvk; 23-Oct-22 at 14:16.

  5. #5
    Member
    Join Date
    Mar 2012
    Location
    Nederland
    Posts
    64
    Delphi 11 heeft volgens mij standaard Range Checking aan staan in debugbuilds, waarschijnlijk komt daarom die fout naar voren. Gebeurt het ook in release-builds?

    Wat betreft je vraag over wat het stukje code doet. Het verzet de Data pointer 16 bits waarna het volgende item wordt uitgelezen.
    Last edited by The_Fox; 09-Nov-22 at 14:34. Reason: bytes -> bits

  6. #6
    Senior Member pcoenen's Avatar
    Join Date
    Apr 2001
    Location
    Tesssenderlo, België
    Posts
    239
    Ja, ook in de release builds. Bedankt voor de info rond het stukje code.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •