1

私のプログラムは、ループ反復の途中でセグ フォールトを経験します。関数中間を呼び出した後、inter_valueまで出力されinter_value[199][208]、その後、セグ フォールトが発生します。範囲外のアクセスでないことを確認するために、inter_value最初に配列を印刷すると、配列は問題なく印刷されます。

これはメモリ不足の象徴ですか?によって作成される配列ctおよびは、静的配列です。inter_valuemallockey_byte

D = 200;
K = 256;
for(j = 0; j < D; j++)
    for(i = 0; i < K; i++)
        printf("inter_value[%i][%i] = %i\n", j, i, inter_value[j][i]);

for(j = 0; j < D; j++) {
    for(i = 0; i < K; i++) {
        intermediate(ct[j][0], key_byte[i], &inter_value[j][i]);
        printf("inter_value[%i][%i] = %i\n", j, i, inter_value[j][i]);
        fflush(stdout);
    }
}
printf("rex\n");


for(j = 0; j < D; j++) {
    for(i = 0; i < K; i++) {
        hamming_dist(ct[j][0], inter_value[j][i], &h[j][i]);
    }
}

関数中間体はこちら

void intermediate(unsigned char ct, unsigned char key_byte, unsigned char *inter_value){
    *inter_value = getSBoxInvert(ct^key_byte);
}

編集 1: 配列の宣言。

//initialize different intermediate values
inter_value = (unsigned char**)malloc(D * sizeof(unsigned char*));
if(inter_value == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    inter_value[i] = (unsigned char *)malloc(K * sizeof(unsigned char)); // this is fix to key size
    if(inter_value[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}


//ct = malloc(row * sizeof(unsigned char*));
ct = (unsigned char**)malloc(D * sizeof(unsigned char*));
if(ct == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    //ct[i] = malloc(column * sizeof(unsigned char));
    ct[i] = (unsigned char *)malloc(column * sizeof(unsigned char));
    if(ct[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}

unsigned char key_byte[256] = {0};

編集2:セグフォルト前のプリントアウト。

inter_value[199][233] = 214
inter_value[199][234] = 119
inter_value[199][2

編集 3: gdb の出力 (別の関数を指しているようです)

プログラム受信信号 SIGSEGV、セグメンテーション違反。hamming_dist の 0x0804a3f5 (ct=31 '\037'、inter_value=203 '\313'、h=0x2) cpa.cpp:53 53 *h = c;

編集 4: gdb から backtrace コマンドを発行した後...

#0 0x0804a3f5 hamming_dist (ct=31 '\037', inter_value=203 '\313', h=0x2) at cpa.cpp:53

#1 メインの 0x0804aff5 (argc=3, argv=0xbffff2f4) at cpa.cpp:266

編集 5: hamming_dist 関数呼び出しとその前に printf 呼び出しを追加します。

編集 6: h の初期化

int **h;
h = (unsigned int**)malloc(D * sizeof(unsigned int*));
if(h == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    h[i] = (unsigned int*)malloc(K * sizeof(unsigned int)); // this is fix to key size
    if(h[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}

編集 7: hamming_dist 関数の宣言。

void hamming_dist(unsigned char ct, unsigned char inter_value, int *h){
    int temp;
    temp = ct ^ inter_value;
    //then count No. of ones
    int c; // c accumulates the total bits set in v
    for (c = 0; temp; c++)
        temp &= temp - 1; // clear the least significant bit set

    *h = c;
}
4

1 に答える 1

4

seg fault は&h[j][i]、hamming_dist パラメータ h の値として渡されたときに 0x2 であるためです。これは、それを逆参照して格納しようとします。これは明らかに、以前の範囲外ストアが を上書きしたためh[j]です。

malloc されたバッファーに範囲外を書き込むと、プログラムの任意の後半まで現れない効果が生じる可能性があることに注意してください。それらはまったく表示されない可能性があります...コードをリリースし、一部の顧客がたまたまバグをトリガーする入力でそれを実行するまで。

于 2012-06-30T02:47:17.133 に答える