Forum: PC-Programmierung DLLs und memset()


von Hardwerker (Gast)


Lesenswert?

Ich heute über eine Unschönheit in einem alten DLL-Code
gestolpert, in dem ein Array nicht komplett auf "hübsch
anzusehende" Werte gesetzt war.

Der Schuldige war schnell ausgemacht:
1
DLLIMPORT void recvap (int *handle, int *length, int *bytes)
2
{
3
  ...
4
  memset( (int *)bytes, -1, *length );
5
  ...
6
}

Das da oben ^^^ funktioniert nicht. Es hat Null Effekt.
Auch nicht nach den üblichen Herumspielereien (*length durch
Konstante ersetzt, andere castings, und und und...)
Das Array beinhaltet vollkommen wirre Werte.

Das hier allerdings:
1
DLLIMPORT void recvap (int *handle, int *length, int *bytes)
2
{
3
  ...
4
  for( i=0; i < *length; i++ )
5
    *bytes++ = -1;
6
  ...
7
}

marschiert ab wie ne Eins.

Aber warum?
Was ist so besonders an einer exportierten DLL-Funktion,
die memset() nicht funktionieren läßt?

von Peter II (Gast)


Lesenswert?

Hardwerker schrieb:
> Aber warum?

kein warum, es geht eigentlich immer. Der Fehler ist also woanders. z.b. 
Debug und Release version gemischt.

von Hardwerker (Gast)


Lesenswert?

"bin" ohne Anführungszeichen geht auch nicht ;-)

von Hardwerker (Gast)


Lesenswert?

Peter II schrieb:
> kein warum, es geht eigentlich immer. Der Fehler ist also woanders. z.b.
> Debug und Release version gemischt.

Es geht auch nicht, wenn die beiden Funktionen da oben
NUR diese Zeilen enthalten.
Kein anderes Fitzelchen an Code...

Die for() Variante initialisiert, das memset() nicht.

von Peter II (Gast)


Lesenswert?

Hardwerker schrieb:
> Es geht auch nicht, wenn die beiden Funktionen da oben
> NUR diese Zeilen enthalten.

glaube ich nicht. kannst du etwas bereitstellen wo man es nachvollziehen 
kann?

Oder hast du eine lib gelinkt wo eine andere memset version drin ist?

von bluppdidupp (Gast)


Lesenswert?

memset() kann unter bestimmten Umständen vom Compiler komplett 
weg-optimiert werden, vllt. passiert das in deinem Falle.
Unter Windows kann SecureZeroMemory() stattdessen verwendet werden.

von Hardwerker (Gast)


Lesenswert?

Peter II schrieb:
>
> Oder hast du eine lib gelinkt wo eine andere memset version drin ist?
>

"Ich hab nix gemacht" (TM)

Ich muß allerdings zugeben, daß mein momentan benutzter Compiler
nun nicht gerade DAS Standardwerk für Win32 ist:

  gcc (GCC) 3.4.2 (mingw-special)
  aus Dev-C++ 4.9.9.2

Wenn Du so sicher bist, daß das funktionieren müßte,
werde ich das Ganze vielleicht doch aus Spaß mal durch ne
andere Toolchain jagen...

von Peter II (Gast)


Lesenswert?

aber was machst du überhaupt mit DLLIMPORT?

Ich habe bis jetzt nur mit DLLEXPORT zu tun gehabt, aber da verwende ich 
auch lieber die .DEF datei.

Ich konnte auch nicht in der Doku finden, wo jemand etwas mit DLLIMPORT 
und gleichzeitig der funktionsimplemtierung.

von Hardwerker (Gast)


Lesenswert?

Peter II schrieb:
> Ich konnte auch nicht in der Doku finden, wo jemand etwas mit DLLIMPORT
> und gleichzeitig der funktionsimplemtierung.

Verzeihung:
1
#if BUILDING_DLL
2
  #define DLLIMPORT __declspec (dllexport)
3
#else
4
  #define DLLIMPORT __declspec (dllimport)
5
#endif

von bluppdidupp (Gast)


Lesenswert?

Die DevCPP-Entwicklung hat übrigens ein anderes Projekt wieder 
aufgenommen:
http://orwelldevcpp.blogspot.de/

von Hardwerker (Gast)


Lesenswert?

bluppdidupp schrieb:
> Die DevCPP-Entwicklung hat übrigens ein anderes Projekt wieder
> aufgenommen:
> http://orwelldevcpp.blogspot.de/

Den mysteriösen Holländer hatte ich heute nachmittag
auch gefunden ;-)

von der mechatroniker (Gast)


Lesenswert?

memset setzt jedes Byte (!) auf -1 (also 0xff), die Schleife (da du mit 
einem int* arbeitest, jedes int. -1 als Byte ist 0xff, -1 als int ist 
0xffffffff. Die Schleife setzt also die ersten 4*length Bytes auf 0xff, 
memset nur die ersten length Bytes.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.