したがって、このコードはそれ自体で機能しますが、メインプログラムで使用すると、コードの完全に無関係な部分が何らかの形で取り込まれ、作成しているファイルに書き込まれます...すべてがなしでコンパイルされます問題があるので、定義の問題でもポインタの問題でもないことはわかっています。他のすべては正しく書き込みますが、どういうわけか、構造体とは関係のない3200バイトを超えるものを取得し、アドレス0x1に書き込みます。構造体の一部でもないファイル...
struct a {
unsigned long addr; //File address
int sz; //Num Bytes
unsigned long pos; // Buffer Address
};
// Many more than this, but you get the general struct idea..
struct a as[][3] = {
{{ 0xF245, 5, 0x6F02C4 }},
{{ 0x471D, 128, 0x65892 }},
{{ 0x6198F, 12, 0xA4092 }}
}
//Failing code
fdin = fopen(files[FIRSTFILE]->filename, "rb");
fdout = fopen(files[SECONDFILE]->filename, "r+b");
if (!fdin) {
fprintf(stderr, "Unable to open %s\n", files[FIRSTFILE]->filename);
fclose(fdin);
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
if (!fdout) {
fprintf(stderr, "Unable to open %s\n", files[SECONDFILE]->filename);
fclose(fdout);
fclose(fdin);
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
私はここに他のコードを持っていますが、ファイルから読み取ってこのような別のコードに書き込むものはありませんが、ここのどこかで、ファイルの範囲アドレス0x1-0xC88に少なくとも3200バイトを誤って書き込み、使用しているデータをプルしていますこのすべての前にpopen関数で。
for (int i = 0; i <= (sizeof(buffer) / sizeof(buffer[0])); i++) {
memset(buffer, 0, sizeof(buffer));
fseek(fdin, as[i]->pos, SEEK_SET);
fread(buffer, 1, as[i]->sz, fdin);
fseek(fdout, as[i]->addr, SEEK_SET);
fwrite(buffer, 1, as[i]->sz, fdout);
}
if(fclose(fdout)==EOF || fclose(fdin)==EOF) {
logit(ONSCREEN, "Error closing files.\n\n");
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
fflush(fdin);
fflush(fdout);
これがメインプログラムのコードの一部で、どういうわけか情報を引き出しています。
sleep(1);
memset(command, 0x00, 256);
sprintf(command, "./somecommand");
fp = popen(command, "r");
if (fp == NULL) {
logit(ONSCREEN, "popen failed.");
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
while(fgets(store, sizeof(store), fp)) {
if (strstr(store, "Expected Output")) {
break;
}
}
pclose(fp);
fflush(fp);
繰り返しになりますが、これらの関数はすべてそれ自体で問題なく機能しますが、1つの関数にまとめると、うまく機能しません...ファイル(FILE * fp、* fdin、* fdout)の名前は異なり、ストア文字配列の名前はバッファとは異なります。私はここで何を間違えましたか?
そのような同じ機能でpopenとfopenを使用することは安全ではないようです。または、ここで適切にクリアしていないものです...?