- ベストアンサー
ごみが入る可能性がある?
- 質問です。fgets( c_mode, 6, fkey ); この部分で、c_mode にごみが入る可能性が有りますか。
- デバッグモードでは動きますが、リリースモードではエラーになります。
- TfECの実行中にエラーが発生する可能性があるので、ごみの入り具合に注意してください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「ゴミ」ってなんです? すくなくとも、提示された部分で明らかな間違いは無さそうです。 ある問題が、プログラム上の別のところでエラーになる、というのは、Cではよくあることです。 特にメモリ関係のミスではよくそうなります。 これもそうではないでしょうか 余談ですが、fgetsは改行、または第2引数-1文字まで取り込む(+\0を末尾に入れる)ので、 fgets( c_mode, 8, fkey ); fgets( c_klen, 8, fkey ); fgets( pass, 128, fkey ); がよいでしょう。ただし、今回は領域が足りているので問題ではありません。
その他の回答 (3)
- wormhole
- ベストアンサー率28% (1626/5665)
何をもってゴミといわれてるのかわかりませんが、 お書きになられてる部分だけでいえば、おかしな動作をしそうなところはないと思います。 (コーディング的に直した方がいいところはありますが)
お礼
ありがとうございました。 fclose(fkey); fclose(stream1); fclose(stream2); として、ファイルを1つずつ閉じたら動きました。 お世話になりました。
- Wr5
- ベストアンサー率53% (2173/4061)
ファイルの内容が書かれている通りなら… fgets()の直前まで不定値が入ってはいますが、 fgets()で'\0'付きになりますから問題にはならないハズです。 >デバッグモードでは動きますが、リリースモードではエラーになります。 どこで、どういうエラーになりますか? keyfnには具体的にどんなのが渡されるのでしょうか? 相対パスでファイル名が渡されていて、実はオープンできなくて >printf( "Can not open key file.\n"); になっていた…。 とか、デバッグビルドとリリースビルドで見ていたファイルが違った…とか言うことはありませんか?
お礼
ありがとうございました。 fclose(fkey); fclose(stream1); fclose(stream2); として、ファイルを1つずつ閉じたら動きました。 お世話になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「ごみが入る可能性」はありますが, この部分だけならその「ごみ」は影響を及ぼさないはず.
補足
ありがとうございます。 関数全体は次のものです。 リリースモードではこの関数が終了しません。 何か分かりましたら、よろしくお願いいたします。 void UY_EC_TF(char *keyfn, char *pt, char *ct){ FILE *fkey; FILE *stream1; FILE *stream2; char c_mode[8], c_klen[8], pass[128]; int i,mode,klen; testData t; int c, block; long mesLength; // 平文長(バイト) char* bufp; unsigned char cstr[BLOCK_SIZE/8+10]; // 暗号文格納場所へのポインタ printf("TfEC Start!\n" ); /* 鍵を読み出すファイルを開く*/ if( (fkey = fopen( keyfn, "rt" )) == NULL ){ printf( "Can not open key file.\n"); return; } fgets( c_mode, 6, fkey ); fgets( c_klen, 6, fkey ); fgets( pass, 127, fkey ); mode = atoi(c_mode); klen = atoi(c_klen); /* 鍵*/ for(i=0; i<klen/4; i++){ hex7String[i] = pass[i]; } hex7String[klen/4] = NULL; /* 平文を読み出すファイルを開く*/ if( (stream1 = fopen( pt, "rb" )) == NULL ) printf( "Can not open plane text file.\n"); /* 暗号文を書き込むファイルを開く */ if( (stream2 = fopen( ct ,"wb" )) == NULL ) printf( "Can not open file for encrypted data.\n" ); /////////////////////////////////////////////////////////////////// // 平文 fseek(stream1, 0, SEEK_END); long filelen = ftell(stream1); fseek(stream1,0,0); int head = sizeof(long); mesLength = filelen + head; if (cipherInit(&t.ci,mode,hex7String) != TRUE) FatalError("cipherInit error during %s test",""/*fname*/); t.keySize=klen; ClearTestData(&t); /* start with all zeroes */ if (makeKey(&t.ki,DIR_ENCRYPT,t.keySize,hex7String/*t.ki.keyMaterial*/) != TRUE) FatalError("Error parsing key during %s test",""/*fname*/); //暗号化 if(mesLength <= BLOCK_SIZE/8){//63が暗号化の作業サイズ 63*20=1260 bufp = (char*)new(char[BLOCK_SIZE/8+10]); if(bufp == NULL){ printf("No memory"); return; } // 平文 *(long *)bufp = filelen; int i = head; do{ c = fgetc(stream1); bufp[i]=c; i=i+1; }while(c!=EOF); bufp[i-1]=NULL; for(int j=0; j+i<BLOCK_SIZE/8+10; j++){ bufp[j+i] = NULL; } mesLength = i-1; // 平文長(バイト) + head memcpy(t.pt,bufp,BLOCK_SIZE/8); // 暗号化実行 if (blockEncrypt(&t.ci,&t.ki,t.pt,BLOCK_SIZE,t.ct) != BLOCK_SIZE) FatalError("blockEncrypt return during %s test","ff.bin"/*fname*/); memcpy(cstr,t.ct,BLOCK_SIZE/8); fseek(stream2,0,0); fwrite( cstr,sizeof(char),BLOCK_SIZE/8, stream2); } else{ long rBlen = mesLength; bufp = (char*)new(char[BLOCK_SIZE/8]);//63が暗号化の作業サイズ 63*20=1260 if(bufp == NULL){ printf("メモリ不足\r\n"); return; } (*(long*)(bufp)) = filelen; int r = 0; do{ // 平文 if(r == 0){ i = head; fseek(stream1, r*BLOCK_SIZE/8, 0);//63が暗号化の作業サイズ 63*20=1260 } if(r > 0 ){ i = 0; fseek(stream1, r*BLOCK_SIZE/8-4, 0);//63が暗号化の作業サイズ 63*20=1260 } do{ c = fgetc(stream1); bufp[i]=c; i=i+1; }while((c!=EOF) && (i<=BLOCK_SIZE/8));//63が暗号化の作業サイズ 63*20=1260 bufp[i-1]=NULL; for(int j=0; j+i<BLOCK_SIZE/8; j++){ bufp[j+i] = NULL; } if(rBlen >= BLOCK_SIZE/8){ block = BLOCK_SIZE/8; }//63が暗号化の作業サイズ 63*20=1260 if(rBlen < BLOCK_SIZE/8){ block = rBlen;} memcpy(t.pt,bufp,BLOCK_SIZE/8); // 暗号化実行 if (blockEncrypt(&t.ci,&t.ki,t.pt,BLOCK_SIZE,t.ct) != BLOCK_SIZE) FatalError("blockEncrypt return during %s test","ff.bin"/*fname*/); // 暗号文を書き込む memcpy(cstr,t.ct,BLOCK_SIZE/8); fwrite( cstr,sizeof(char),BLOCK_SIZE/8, stream2); r += 1; rBlen -= block; }while(rBlen>0); } _fcloseall(); printf("TfEC End!\n" ); }
お礼
ありがとうございました。 fclose(fkey); fclose(stream1); fclose(stream2); として、ファイルを1つずつ閉じたら動きました。 お世話になりました。