仕様上の問題点

  • 参照型をスタックに積むとき(関数の引数など)に参照カウントを増やさないため、開放されたメモリーにアクセスする。
    ^int a.new(1);
    f(a);
    void f(^int a)
    {
      .a.new(0);
      a<> = 0;//メモリー破壊
    }
    
  • 後ろに追加できる配列の長さを伸ばした場合参照渡しのポインタが解放されたメモリーを指したままになる。
    %int a;
    f(a.new[0]=);
    void f(int a=)
    {
      .a.new[9];
      a = 0;//メモリー破壊
    }
    
  • メンバ関数を実行中でもオブジェクトが破棄されてクラスのメンバーを指すポインタが解放されたメモリーを指したままになる。
    ^&C a.new(1);
    a~f(); 
    &C
    {
      int b;
      public void f()
      {
        .a.new(0);
        `b = 0;//メモリー破壊
      }
    }
    
  • 後ろに追加できる配列の長さを伸ばした場合クラスのメンバーを指すポインタが解放されたメモリーを指したままになる。
    %&C a.new[0].f(); 
    &C
    {
      int b;
      public void f()
      {
        .a.new[9];
        `b = 0;//メモリー破壊
      }
    }
    
  • 無名関数の再帰で無名関数のローカル変数や引数が破壊される。
    void f()
    {
      int a = 0;
      ~$int(int) d = [int(int b){
        int c = b;
        if(b == a) c += d(:b+1:);
        ret b + c;
      }];
      int e = d(:a:); // eが3になる
    }
    f();