warum streikt dieser code?

01/09/2012 - 14:07 von Jens Kallup | Report spam
Hallo,

siehe topic:


typedef int (*myproc2)(int);

void ExecMapFile(int (*ptr)(void))
{
int fd;
myproc2 callback;

if ((fd = open("z.bin",O_RDONLY)) < 0)
{
fprintf(stderr,"%s : Konnte Eingabedatei nicht
öffnen",strerror(errno));
}

lseek(fd,0x200,0);

printf("0x%x",ptr);


callback = mmap(0, 1024, PROT_READ | PROT_EXEC, MAP_SHARED, fd,
0x400000);
close(fd);

callback((int)callback);
}
 

Lesen sie die antworten

#1 Stefan Reuther
01/09/2012 - 15:26 | Warnen spam
Jens Kallup wrote:
Hallo,

siehe topic:



Wahrscheinlich will er mehr Urlaub, mehr Gehalt und weniger Wochenendarbeit.

Zur Beantwortung deiner Frage wàre ansonsten interessant, was das
erwartete Verhalten ist und welche Differenz des beobachteten Verhaltens
dich zu der Annahme bringt, der Code würde streiken.
<http://www.catb.org/esr/faqs/smart-...recise>

Ich sehe hier eine Funktion, die einen Parameter bekommt, den sie als
Hexwert auszugeben versucht...

void ExecMapFile(int (*ptr)(void))
{
[...]
printf("0x%x",ptr);



...was auf Plattformen wie x64 oder MS-DOS-Large-Model aufgrund des
nicht zueinanderpassenden Formatstrings und Parameters nicht korrekt
funktionieren wird.

Außerdem sehe ich eine Funktion, die eine Datei ab Position 0x400000
mappt und den Inhalt ausführt...

void ExecMapFile(int (*ptr)(void))
{
int fd;
myproc2 callback;
if ((fd = open("z.bin",O_RDONLY)) < 0)
{
fprintf(stderr,"%s : Konnte Eingabedatei nicht öffnen",strerror(errno));
}
lseek(fd,0x200,0);
callback = mmap(0, 1024, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0x400000);
close(fd);
callback((int)callback);
}



...worin jetzt kein offensichtlicher Fehler zu erkennen ist, jedenfalls
wenn die Datei mindestens 4195328 Bytes groß ist, außer, dass der
(int)-Cast am Ende wieder auf x64 Informationen vernichtet.


Stefan

Ähnliche fragen