Habe mit Delphi 11.2 jetzt eine Anwendung für 64-Bit Windows kompiliert und festgestellt, dass es eine Schutzverletzung für diesen code gibt:
Delphi-Quellcode:
{$J+}
procedure DrawDots (x, y: Integer; c: TCanvas); StdCall;
const
Counter: Byte = 0;
begin
counter := counter shl 1;
if counter = 0 then counter := 1;
case counter of
1, 2, 4, 8 : C.pixels[x,y] := clWhite;
else
C.pixels[x, y] := clBlack;
end;
end;
{$J-}
procedure hs_Rectangle (c: TCanvas; x1, y1, x2, y2: Integer);
begin
LineDDA (x1, y1, x2, y1, @DrawDots, LongInt (C));
LineDDA (x1, y1, x1, y2, @DrawDots, LongInt (C));
LineDDA (x1, y2, x2, y2, @DrawDots, LongInt (C));
LineDDA (x2, y1, x2, y2, @DrawDots, LongInt (C));
end;
Standardmäßig war hier die Option "High-Entropy für 64 Bit-ASLR (Adress Space Layout Randomization) aktiviert.
Wenn man diese Option ausschaltet, läuft wieder alles ohne Probleme.
Alternativ kann man das hier auch fixen (muss man auch), indem man statt "LongInt" "INT64" verwendet.
Ich muss gestehen, das ist so eine Art old legacy code, den ich irgendwann mal irgendwo kopiert habe und mir darüber dann keine weiteren Gedanken mehr gemacht habe.
Unter
Win32 ist das mit LongInt kein Problem, da ja jedes Programm eh nur 2GB Adressraum zur Verfügung hat (mal abgesehen von dem Trick es auf 3 GB zu puschen). Unter Win64 habe ich bislang kein Problem gehabt, wahrscheinlich liegen im Compilat bzw. auf dem Heap caller und aufgerufende Funktion immer nah genug zusammen.
Mit der ALSR High Entrpoie Funktion wird aber anscheinend die aufgerufene Funktion in einen Adressbereich > 2GB verschoben, so dass es dann kracht.
Auch wenn man das hier leicht fixen kann, ich habe ASLR high-entropie erst mal ausgeschaltet. Mein PixPower" Programm hat inzwischen mehr als 1 Mio Zeilen Source-Code, davon eine Reihe von Dritt-Komponenten und old legagy code, da ist eher anzunehmen, dass dort ähnliche Hunde begraben liegen.
Wollte mit dieser Info mal auf die Problematik aufmerksam machen und fragen, ob Ihr evtl. auch schon ähnliche Stolperstellen diesbezüglich gefunden habt. Vom Compiler gab es übrigens keine Warnung oder Hinweis...