これまでで最も奇妙なバグ-Int定義はSigsegvを引き起こします。スタックオーバーフロー?

StackOverflow https://stackoverflow.com/questions/4539995

  •  13-10-2019
  •  | 
  •  

質問

私はBSPLIBを使用しています。複数のスレッドで実行されている関数(他の多くの)で実行されている関数に「int i」の単純な定義を追加すると、「Process 2 Cated Signal 11 Segmantation Fault」などのメッセージが表示されます。私は多くをチェックしたことに注意することが重要です。それなしでは、セグメンテーションの障害が得られず、それを使用してほとんど常に取得します。 INT定義はどのようにそれを引き起こす可能性がありますか?私が引き起こしたかもしれないスタックオーバーフローはありますか?ありがとう。

int P;
int main( int argc, char* argv[] )
{
    /** sequentail - process 0 */
    P=bsp_nprocs(); /// maximum number of process avialble (must do that on sequential part ,need for bsp begin)
    bsp_begin(P);
    char* str1;
    char* str2;
    int n;
    int** table;
    int thread=bsp_pid();
    int num_threads=bsp_nprocs();
    if(thread == 0)
    {
        ifstream file1(argv[1]);
        ifstream file2(argv[2]);
        // check if the strings are the same size RDBG
        string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());
        string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>());
        n=string1.length();
        str1= (char*)malloc(sizeof(char)*(n+1));
        str2= (char*)malloc(sizeof(char)*(n+1));
        strcpy(str1,string1.c_str());
        strcpy(str2,string2.c_str());
    }
    if (thread!=0)
    {
        str1= (char*)malloc(sizeof(char)*(n+1));
        str2= (char*)malloc(sizeof(char)*(n+1));
    }
    bsp_push_reg(&n,SZINT);
    bsp_sync();
    bsp_get(0,&n,0,&n,SZINT);
    bsp_sync();
    if (thread==0)
    {
        table=(int**)malloc(sizeof(int)*(n+1));
        for (int i=0; i<n+1; i++)
            table[i]=(int*)malloc(sizeof(int)*(n+1));
    }
    bsp_push_reg(str1,SZCHAR*(n+1));
    bsp_push_reg(str2,SZCHAR*(n+1));
    bsp_push_reg(table,n*n*SZINT);
    bsp_sync();
    if (thread==0)
    {
        for(int t=1; t<num_threads; t++)
            for (int k=0; k<=n; k++)
            {
                bsp_put(t,str1+k,str1,k*SZCHAR,SZCHAR);
                bsp_put(t,str2+k,str2,k*SZCHAR,SZCHAR);
            }
    }
    bsp_sync();
    cout << thread << "!!!" << str1 << ";" << str2 << endl;
    int i;
    bsp_sync();
    bsp_pop_reg(table);
    bsp_pop_reg(str2);
    bsp_pop_reg(str1);
    bsp_pop_reg(&n);
    bsp_sync();
    free(str1);
    free(str2);
    bsp_sync();
    bsp_end();
    return 0;
}
役に立ちましたか?

解決

テーブル変数の宣言/初期化が正しくありません。一方、n*n intの隣接するメモリブロックであることをbsplibに伝えているのに対し、アレイの配列(n+1個の異なるメモリブロックとして)として初期化しています。割り当てまたは登録を変更する必要があります。

結果として、BSPLIBはまったく初期化されていないメモリを上書きします。

他のヒント

セムに無害な変化が問題を引き起こすか修正する大部分の場合、あなたはハイゼンバグとして知られているものを持っています。その場合、根本的な原因であるのは実際の変化ではなく、変化は真のバグを表面化するための単なる触媒です。

bsplibがそのスレッドをどのように行うかは完全に確信していませんが、 n 場合の場合、値は初期化されません thread ゼロ以外です。

言い換えれば、値はの長さに設定されます string1 それだけに thread == 0 しかし、それは慣れています malloc のためのスペース thread !=0, 、スペースは、たまたまスタックにあったものに依存していると述べた。

    string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());
    string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>());
    n=string1.length();
    str1= (char*)malloc(sizeof(char)*(n+1));
    str2= (char*)malloc(sizeof(char)*(n+1));
    strcpy(str1,string1.c_str());
    strcpy(str2,string2.c_str());

string2がstring1より長い場合はどうなりますか?これは今までにありますか?あなたは使用しています malloc のサイズを割り当てるには string1str2. 。もしも string2 より長いです string1, 、あなたはオーバーフローを緩衝し、おそらくあらゆる種類のものを記憶に巻き起こします。

あなたがしているべきです n1 = string1.length(); n2 = string2.length();?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top