12

生徒のコードが割り当てによって暴走し、テスト マシンが停止するのを防ごうとしています。私はもう試した

setrlimit(RLIMIT_DATA, r);

whererは制限を保持する構造体です。残念ながら、この制限は停止brksbrkて割り当てられなくなりますが、C ライブラリはフェールオーバーしmmapて割り当てを続行します。

私も試してみました

setrlimit(RLIMIT_AS, r)

から返されENOMEMた値に遭遇したときにコードが呼び出すためのスタック領域がないため、プロセスがエラーから回復することは不可能です。NULLmalloc()

バイナリに対する制御は限られているため、システム コールを使用できる場合は、それを希望します。しかし、プロセスの回復能力を損なうことなく割り当てを制限する手段が必要です。誰にも提案はありますか?

更新: failmallocと呼ばれるものを見つけましたが、あまり洗練されていません。これで失敗する可能性はありますが、gdb が診断できない segfault が常に発生します。

さらに更新:少なくともいくつかのケースでは、それが私が望む仕事をしているように見えることがsetrlimit(RLIMIT_AS, r) わかりました.後で発生していたセグメンテーション違反は、無関係なモジュールの障害によって引き起こされました. 誰かが何か面白いこと (または質問を残す理由) を思いつかない限り、おそらく質問を削除します。

4

2 に答える 2

5

failmallocで使用されるアイデアに基づいて構築すると、LD_PRELOAD * 環境変数と関数の割り込みを使用してラッパーを構築し、malloc()そこに制限を課すことができます。

malloc()を使用して、元のポインタを動的にロードする必要がありますdlsym()malloc()ラッパー自体への再帰呼び出しとして解釈されるため、ラッパーからオリジナルを直接呼び出すことはできません。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

void * malloc(size_t size)
{
   static void * (*func)(size_t) = NULL;
   void * ret;

   if (!func)
   {
      /* get reference to original (libc provided) malloc */
      func = (void *(*)(size_t)) dlsym(RTLD_NEXT, "malloc");
   }

   /* impose any necessary restrictions before calling malloc */
   ...

   /* call original malloc */
   ret = func(size);

   /* impose any necessary restrictions after calling malloc */
   ...

   return ret;
}

*LD_PRELOADインターポーザ ライブラリへのフル パスを指定する必要があることに注意してください。また、セキュリティ上の問題を防ぐために、setuid プログラムではライブラリのインターポジションが無効になっていることに注意してください。


を使用する代わりdlsym()に、GNU リンカ--wrap symbolオプションを使用することもできます。

于 2010-10-06T04:24:15.553 に答える
3

無防備な生徒にマクロを強制できますか? :-)

#define malloc(bytes) limited_malloc(bytes)

また、その定義によってlimited_malloc、できることが制限されます。

于 2010-10-06T01:36:09.023 に答える