Hallo negaH und alle anderen!
Wir nutzen die
DEC Library nun schon vielfältig und oft, da sie einfach ein sehr gutes Werk ist, welches in vielen Bereichen verwendet werden kann. Bei uns ist ein gemischtes System in Benutzung, also C++ und Delphi gemischt. Von daher werden für Delphi Quellen auch entsprechende statische Librarys generiert. Dies dient u.a. der Erzeugung der .hpp Dateien als auch der LIB für den Linker. Wir haben mit vielen Delphi Bibliotheken kein Problem mit und hatten somit auch keine Bedenken bei der
DEC. Die Lib ist nun schon eingebunden und bei meinem letzten Arbeitsauftrag bin ich damit auf die Nase gefallen. Hier hatte ich nun zum ersten Mal die
DEC unter C++ genutzt, aber über einen Zwischenschritt von Delphi Code. Es ist eine fertige Bibliothek welche die
DEC nur nutzt, u.a. zur Hash Generierung. Diese Library unter C++ genutzt bringt keine verwertbaren Ergebnisse. Nach mehrfachen debuggen etc. konnte ich den Fehler in der
DEC nachweisen, welche mir unter C++ Programmen immer einen anderen Hash generierte von den gleichen Daten. Da das C++ Programm nur eine Bibliothek von mir nutzt, welche die
DEC nutzt, war es einfach diese Bibliothek von mir mal in einem Delphi Programm aufzurufen und siehe da: Hashes stimmten immer.
Zusammengefasst folgendes Verhalten:
DEC Library direkt in Delphi Programm: richtiger Hash, mit jedem Prozessstart der gleiche
DEC Library direkt in C++ Programm: zufälliger Hash, während der Laufzeit konstant, mit jedem Prozessstart ein anderer
DEC Library indirekt* in einem C++ Programm: zufälliger Hash, während der Laufzeit konstant, mit jedem Prozessstart ein anderer
* indirekt bedeutet hierbei, das C++ Programm ruft eine Delphi
Unit auf, welche die
DEC aufruft.
Ich habe mal ein entsprechendes Projektsystem gebaut und angehangen um den Fehler zu verdeutlichen.
DEC.lib - die C++ Lib mit der
DEC
Bug01a - Delphi Programm
Bug01b - C++ Programm mit direkten Aufruf
Bug01c - C++ Programm mit indirekten Aufruf
Genutzt wird hierbei
RAD Studio 2007 mit allen Fixes und Updates.
Hier nochmal eine kurze Log mit den Aufrufen der Compilate:
Code:
Bug01a, erster Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9
Second attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9
Bug01a, zweiter Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9
Second attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9
Bug01b, erster Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: 852DC1C54D632C2DE8D15BE4CFEABB730C1E18A47C6E28C8FFC96D93FB6EF4F6B947ECA11F2FD8B65A3BB62FDB71AD07
Second attempt
hashing value 'test' with SHA384
hash value: 852DC1C54D632C2DE8D15BE4CFEABB730C1E18A47C6E28C8FFC96D93FB6EF4F6B947ECA11F2FD8B65A3BB62FDB71AD07
Bug01b, zweiter Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: 32EDC34544F5A47F121E3F2AE925D9EE5DEF3D5FD40ABE860F423B6C9926DDEAFCB4AE882BE394C791893066020BAE53
Second attempt
hashing value 'test' with SHA384
hash value: 32EDC34544F5A47F121E3F2AE925D9EE5DEF3D5FD40ABE860F423B6C9926DDEAFCB4AE882BE394C791893066020BAE53
Bug01c, erster Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: FEEEB9B21A027909711598969183D2750A013B9BEAB5E16C73F395A721AF3FD0DF3339E849DB3E818476B8F58E70A33C
Second attempt
hashing value 'test' with SHA384
hash value: FEEEB9B21A027909711598969183D2750A013B9BEAB5E16C73F395A721AF3FD0DF3339E849DB3E818476B8F58E70A33C
Bug01c, zweiter Aufruf:
First attempt
hashing value 'test' with SHA384
hash value: 84A9B12CD17583412EEC5997DB11604B6696BE426C7F46CCD1CDCCAC33A5230885E4D57E24CD365D12BEDE98BE3C350F
Second attempt
hashing value 'test' with SHA384
hash value: 84A9B12CD17583412EEC5997DB11604B6696BE426C7F46CCD1CDCCAC33A5230885E4D57E24CD365D12BEDE98BE3C350F
Diese ist auch im Archive als
output.log enthalten.
Hinweise:
- ich habe schon probiert O+/O-, was bei dir intern ja die Nutzung von
ASM/Pascal umschaltet: keine Änderung
- die eingefügten $Z4 sind Pflicht, da RAD2007 Studio bei Delphi Quellen in einer C++ Programm/Library die Delphi Optionen teilweise nicht weitergibt, u.a. die Enum-Grösse, was dann zu falschen DCUs führt.
Grüße,
Thomas aka Muetze1 @ mikrocontroller.net aka Muetze1 @ delphipraxis.net ;-)