2

bind のソース コードの一部、具体的には以下の rdataset.c ファイルのランダム オーダー セクションを変更しています。

for (i = 0; i < count; i++) {
    dns_rdata_t rdata;
    isc_uint32_t val;

    isc_random_get(&val);
    choice = i + (val % (count - i));
    rdata = shuffled[i];
    shuffled[i] = shuffled[choice];
    shuffled[choice] = rdata;
    if (order != NULL)
        sorted[i].key = (*order)(&shuffled[i], order_arg);
    else
        sorted[i].key = 0; /* Unused */
    sorted[i].rdata = &shuffled[i];
}

選択して行を変更し、その変数をこのような関数から取得させます

choice=weightCal();

関数のコードは

unsigned int weightCal() {
    FILE *file = fopen("weight.txt", "r");  
    double integers[10],prob[10]; 
    unsigned int i=0,j=0,k=0; 
    double sum=0,subSum=0,num; 
    unsigned int result=0;
    while(fscanf(file, "%lf", &num) > 0) {
        integers[i] =num;
        sum+=num;
        i++;    
    }
    rewind(file);    
    while(fscanf(file, "%lf", &num) > 0){
        subSum=subSum+num;  
        prob[j]= subSum / sum;  
        j++;
    }   
    srand(time(NULL));   
    double r = rand() / (double)RAND_MAX;    
    for(k=0;k<sizeof(prob)/sizeof(double);k++) {
        if (r <  prob[k]) {     
            result=k;       
            break;  
        }    
    } 
    fclose(file);
    return result;
}

次に、bind を再コンパイルします。コンパイルは機能しますが、コマンドを使用すると:

dig www.example.com. @127.0.0.1 

「セグメンテーション エラー (コア ダンプ)」というエラーが返されます。私はそれをデバッグしようとしましたが、デバッガーはエラーが行にあると私に言いました

while(fscanf(file, "%lf", &num) > 0)

このエラーを修正するにはどうすればよいですか?

4

2 に答える 2

5

fileそうではないことを確認してくださいNULL- それは良い出発点です。みたいな一行

while(fscanf(file, "%lf", &num) > 0)

何か問題がある場合file(無効なポインターまたは破損した内部データ構造)、通常はクラッシュします。ただし、ファイルの入力値がdoubleタイプの範囲外である場合、一部のプラットフォームがクラッシュする可能性があります。

また、ローカル データがプラットフォーム上でどのようにレイアウトされているかによっては、配列の 1 つの末尾を超えてメモリを上書きすると、 の値が破壊fileされ、無効なポインタになる可能性があります。どのサイクルでも、範囲外のアクセスをチェックすることはありません。入力ファイルにちょうど 10 個のデータ値がありますか? (関数の最後のサイクルは、正確に 10 個の要素を反復する可能性があることに注意してください。つまり、10 個未満では実行できません)。

于 2013-08-28T20:54:18.303 に答える