1

したがって、このコードはそれ自体で機能しますが、メインプログラムで使用すると、コードの完全に無関係な部分が何らかの形で取り込まれ、作成しているファイルに書き込まれます...すべてがなしでコンパイルされます問題があるので、定義の問題でもポインタの問題でもないことはわかっています。他のすべては正しく書き込みますが、どういうわけか、構造体とは関係のない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を使用することは安全ではないようです。または、ここで適切にクリアしていないものです...?

4

1 に答える 1

0

In your example, as[] has 3 elements (your real-life code may have a different number)

// Many more than this, but you get the general struct idea..
struct a as[][3] = {
    {{ 0xF245, 5, 0x6F02C4 }},
    {{ 0x471D, 128, 0x65892 }},
    {{ 0x6198F, 12, 0xA4092 }}
}

However, you're using the number of elements in buffer (which in a comment you say is char buffer[256] to index it:

   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);
    }

Change the for loop to (note also that the test is changed from <= to <):

  for (int i = 0; i < (sizeof(as) / sizeof(as[0])); i++)  

Finally - I think you're making things unnecessarily more complicated (and probably buggy) by using a 2 dimensional array for as for no reason. try:

struct a as[] = {
    { 0xF245, 5, 0x6F02C4 },
    { 0x471D, 128, 0x65892 },
    { 0x6198F, 12, 0xA4092 }
}


// ...
   for (int i = 0; i < (sizeof(as) / sizeof(as[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);
    }
于 2013-03-10T19:44:59.607 に答える