1

プログラムで次の型と関数を宣言しました。

typedef char TYPE_name_type;
typedef char TYPE_name_category;
typedef struct {
   TYPE_name_category category;
   TYPE_name_type id;
} TYPE_cod_name;
typedef struct {
   TYPE_name_type name;
   TYPE_cod_name image;
} TYPE_beta_name;
typedef struct {
   TYPE_cod_name lefty;
   TYPE_cod_name righty;
} TYPE_codomain_pair;
typedef char TYPE_thread_ref;
typedef struct {
   TYPE_beta_name items[2];
   unsigned int length;
} TYPE_beta_env;
typedef struct {
   TYPE_thread_ref pid;
   TYPE_beta_env env;
} TYPE_thread_env;
typedef struct {
   TYPE_thread_env items[3];
   unsigned int length;
} TYPE_beta_type;

TYPE_beta_type FUNCTION_post_Reset
(TYPE_beta_type  V34,
 TYPE_thread_ref V35) {
  TYPE_beta_type result;
  TYPE_beta_type V78 = (TYPE__EMPTY_CONST_beta_type);
  TYPE_thread_env V79;
  TYPE_beta_type V79_cont;
  unsigned int V79_index;
  V79_cont = V34;
  V79_index = 0;
  V79 = V79_cont.items[0];
  if (V79_cont.length > 0) {
    while (1) {
      if (V79.pid == V35) {
         V78 = TYPE__OP_thread_env__CONCAT_OP__beta_type(V78, V79);
      }
      if(V79_index == (V79_cont.length - 1)) break;
      V79_index ++;
      V79 = V79_cont.items[V79_index];
      assert (V79.pid == V79_cont.items[V79_index].pid);
    }
  }
  return V78;
}

前の行での構造体から構造体への代入の直後に、プログラムが関数の最後のアサートで停止することがあることに気づきました。gccのいくつかのバージョンを試しました。4.3.6、4.7.2では正常に動作しますが、4.6.3では常に失敗します。

私はカーネル3.6.11で32ビットのFedora16に取り組んでいます。

gcc 4.3.6の問題が原因でしょうか、それとも何かを見落としているのでしょうか?

4

1 に答える 1

1

これは、プログラミングで起こりうる最悪の間違いの1つである、固定バッファサイズの使用の結果です。要件が変更され、固定バッファサイズが十分でないため、遅かれ早かれ問題が発生することはほぼ確実です。

ここで問題となるのは、アイテムのサイズが3のみであり、アサートが失敗するとV79_indexが3になると確信しています。

追伸:世界中で固定バッファサイズが使用されていることは知っています。しかし、全世界はかつて後藤を使用していました。そして、私は両方とも有害だと考えています。

于 2013-06-05T19:58:18.107 に答える