-1

C GNU/Linux コードを FreeBSD に移植しようとしています。最初はコンパイルして異常動作しないと思っていたのですが、他のOSがネイティブに持っていない機能を使っていないので特に気になりませんでした。正常にコンパイルされますが ( を使用してエラーや警告は発生しません-Wall)、アプリケーションは、GNU/Linux インストールで意図したとおりに正常に動作する行でセグ フォールトを継続します。

私がやっていることは、構造体へのポインターを作成し、そのポインターを void ポインターとして関数に渡し、関数内で再作成することです。

元:

typedef struct
{
   int i;
}some_struct;

int main()
{
   some_struct *test = malloc(sizeof(some_struct));
   test->i = -1;
   function(test);

return 0;
}

void *function(void *prarm)
{
   some_struct test = *((some_struct *)param);  //segfaults on this line.
   free(param);


return NULL;
}

私のGNU/Linuxインストールでは、これにより、関数内でローカルに渡されたポインターデータを使用して構造体を再作成し、mallocedメモリーを解放できるようになりますmain()が、FreeBSDではセグフォルトが発生し、理由がわかりません。

途中で打ち込んでタイプfunctionするとgdb

p *(some_struct *)param

ポインターから作成されたコマンド構造体と、関数内のすべての変数を正常に出力します。

私の FreeBSD テスト マシンで、なぜこれが GNU/Linux と seg faulting で動作するのか、私は途方に暮れています。

私が抱えているこの問題に対する助けに感謝します。

4

3 に答える 3

2

非常に大きなスタック フレームを作成しています。

char buff[3000600], data[3000000], url[1024], c[1];

これはほぼ 6MB です。おそらく、FreeBSD のデフォルトのプロセス スタック サイズ制限を超えていますか? FreeBSD はSIGSEGV、この制限を超えるプロセスを強制終了するために使用します。これは、スタックが制限を超えて拡張される原因となるローカル変数に書き込むと検出されます。でスタック サイズの制限を微調整できますlogin.conf

于 2012-11-28T07:42:25.273 に答える
2

これが失敗するのは奇妙です。関数の順序を変更したり、function使用前に宣言したりしましたか(メインの前):

void *function(void *prarm);
于 2012-11-28T06:38:21.507 に答える
1

-Wall特にサイレントの場合、セグメンテーション違反の理由はわかりません。

これについて私を悩ませていることの 1 つはfunction()、 の呼び出しの時点で有効な明らかな宣言がないことmain()です。宣言がない場合、C はパラメーターが整数として渡されると想定するため、警告が表示されます。main() の上に関数宣言を追加する、関数定義を main の上に移動する、main() の前にインクルードされるヘッダー ファイルに宣言を入れるなど、いくつかの方法でこれを修正できます。

于 2012-11-28T06:39:23.480 に答える