AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zufals-Boolean erzeugen

Ein Thema von ManuMF · begonnen am 25. Sep 2005 · letzter Beitrag vom 27. Sep 2005
 
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#19

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 13:35
@alzaimar:

ich weis das dies funktioniert. Aber nur weil der Compiler einen Boolean als

FALSE = 0
TRUE <> 0

ansieht, was aber nicht offiziell dokumentiert ist. Der Compiler kann diese Logik benutzen weil auf Intel CPUs die Anfrage auf == 0 oder <> 0 über die Prozessorflags und deren Auswertung per Bedingte Sprünge so easy ist. Würde der Borland Compiler aber zb. auf ARM Kernen laufen so ginge dies eben nicht mehr.
Offiziell ist ein Boolean aber als

FALSE = 0
TRUE = 1

definiert. Was aber keine plausible Begründung für (Integer mod 2) in [0,1] in Boolean sein darf, da sich diese Definition jederzeit ändern könnte.

Angenommen folgender Code:

Delphi-Quellcode:
function BooleanToString1(Value: Boolean): String;
const
  sBoolean: array[Boolean] of String = ('FALSE', 'TRUE');
begin
  Result := sBoolean[Value];
end;

function BooleanToString2(Value: Boolean): String;
const
  sBoolean: array[Boolean] of String = ('FALSE', 'TRUE');
begin
  Result := sBoolean[Value <> False];
end;

procedure Test;
var
  S: String;
begin
  S := BooleanToString1(Boolean(2));
  WriteLn(S);

end;

// und

begin
  if Boolean(2) then
  begin
    WriteLn('test');
  end;
end;
probier ihn aus.
Man muß dann schon BooleanToString2() benutzen um falsche TypCast zu eliminieren und den Code Bulletproof zu machen, was aber im Grunde nur duch die ungültigen TypCast zb. anderer Programmierer verursacht wurde.
Im zweiten Beispiel sieht man das der Compiler den Bytewert 2 einfach auf <> 0 abfragt und dieses über die Möglichkeiten der Intel CPUs als gültiges TRUE akzeptiert.

Das heist: solche ungültigen TypCast nach Boolean funktionieren innerhalb von Anfragen immer sauber, auf Grund der spezifischen Umsetzung in den Machinencode der Intel CPUs. Sie führen aber bei bestimmten PASCAL/Delphi konformen Sourcen, wie in BooleanToString1() gesehen, zu unvorhersehbarem Verhalten des Programmes. Dies wird dann zu Zugriffsverletzungen führen, obwohl der Code in BooleanToString1() absolut astreiner Delphi Source ist.

Wir alle können uns nun sicher vorstellen wie der Programmierer von BooleanToString1() stundenlang in seinem Sourcecode nach der Ursache dieser Zugriffsverletzungen suchen wird.

Gruß Hagen
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz