PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : #define mag mich nicht



maxxle
23-11-2004, 20:52
Es geht um diesen define hier:


#define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \
l |=((DES_LONG)(*((c)++)))<< 8L, \
l |=((DES_LONG)(*((c)++)))<<16L, \
l |=((DES_LONG)(*((c)++)))<<24L)


Dabei soll eine unsingend char[] zu einer unsigned long gewandelt werden.

Der Code dazu ist folgender:



DES_LONG tout0; // Hier handelt es sich um einen __u32
unsigned char *iv;

c2l(iv,tout0);



Das ganze ist nicht auf meinem Mist gewachsen, sondern kommt in Krypto-Progs (hier DES, aus OpenSSL genommen) vor.

Compilerlauf = ok!
Programmlauf = ok!

Aber bei dieser c2l(); hört er einfach auf und macht scheinbar unbeirrt weiter ?!?




[snip]




Verstehe ich wenigstens das hier richtig?


l|=((DES_LONG)(*((c)++)))<< 8L, \



l = l Oderverknüpft mit dem was beim Cast von dem unsingned char rauskommt und um 8bit geshifted?
Aber was ist das "L"?

wraith
23-11-2004, 21:17
Aber bei dieser c2l(); hört er einfach auf und macht scheinbar unbeirrt weiter ?!?
Mit dieser Fehlerbeschreibung kann ich garnichts anfangen.
Was heißt er macht weiter?Endlosschleife?

Minimales Testprogramm


#include <stdio.h>

typedef unsigned long DES_LONG;

#define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \
l |=((DES_LONG)(*((c)++)))<< 8L, \
l |=((DES_LONG)(*((c)++)))<<16L, \
l |=((DES_LONG)(*((c)++)))<<24L)


int main()
{
DES_LONG l;
unsigned char array[] = {4,3,2,1};

unsigned char *c = array;

c2l(c,l);

printf("%lu\n",l);

return 0;
}




Verstehe ich wenigstens das hier richtig?
l = l Oderverknüpft mit dem was beim Cast von dem unsingned char rauskommt und um 8bit geshifted?
Die Idee ist doch, daß du ein char Array hast, also 4 * 8 Bit, die du auf einen unsigned long (32 Bit) verteilen willst.
Die erste Position des Arrays wird zur den unteren 8 Bit, die zweite Position des Arrays wird um 8 Bit nach links verschoben (also rechts mit Nullen aufgefüllt), und dann mit dem bisherigen Ergebnis verodert, usw...


Aber was ist das "L"?
Das sagt dem Compiler nur, daß er die 8 (bzw. 16, 24), nicht als int (was er normalerweise tun würde) interpretieren soll, sondern als long.

Boron
24-11-2004, 12:40
Und warum überhaupt ein #define benutzen? Ist so nicht widerlich?

Wenn, dann würde halt eine Funktion daraus machen.
Wenn man diese Funktion dann noch inline deklariert, dann spart man sich auch den Funktionsaufruf, aber es ist halt bedeutend schöner als ein #define.

Ich denke, dass du dann auch besser debuggen kannst wegen diesem doofen Fehlverhalten.

maxxle
24-11-2004, 16:46
Ich hab den Code ja nicht geschrieben. Und bevor ich das in eine Funktion reinpacke, versuche ich erst, den define hinzubekommen.

Es gibt nämlich noch 5 oder 6 andere defines, die gleich aufgebaut sind - und ich möchte so wenig wie möglich dran rumtricksen.

Ich werde mir mal das Beispielproggi ansehen.



zum Fehler:
Das Programm startet soweit. Mit printf hab ich mir debug-Messages ausgeben lassen. Eine vor der c2l() eine danach. Die davor wird ausgegeben, die danach nicht.
Wobei kdevelop sagt, das alles in Ordnung war. (Exited normally)

KL47
24-11-2004, 18:29
Kenn mich mit den Versionen nicht aus, aber bei gcc 3.3 gibts "-E", das macht nur Precompiling, davon solltest du dir mal den Quellcode anschauen, dann siehst du, was der dir aus deinen ganzen #defines (evil (http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.5) ;)) macht.