示例#1
0
  public static void Go(){
      MyUnion2 u2 = new MyUnion2();
      MyUnion1 u1 = new MyUnion1();

    u1.i = 0;
    u1.o.o = new Bar();

    Console.WriteLine("BEFORE: u1.o.o.getI(): {0}.  (EXPECT 1)",u1.o.o.getI());

    u2.i = 0;
    u2.o.o = new Foo();

    // write the Foo's objref value now in u2.o into the int field of u1, 
    // thereby overwriting the Bar objref that had been in u1.o.
    u1.i = u2.i; 

    // If u1.o.o.getI() returns 42, that means that we were able to write to a private 
    // member variable of Bar, a huge security problem!
    int curI = u1.o.o.getI();
    Console.WriteLine("AFTER: u1.o.o.getI(): {0}.  (BUG if 42)",curI);
  }
示例#2
0
    public static void Go()
    {
        MyUnion2 u2 = new MyUnion2();
        MyUnion1 u1 = new MyUnion1();

        u1.i   = 0;
        u1.o.o = new Bar();

        Console.WriteLine("BEFORE: u1.o.o.getI(): {0}.  (EXPECT 1)", u1.o.o.getI());

        u2.i   = 0;
        u2.o.o = new Foo();

        // write the Foo's objref value now in u2.o into the int field of u1,
        // thereby overwriting the Bar objref that had been in u1.o.
        u1.i = u2.i;

        // If u1.o.o.getI() returns 42, that means that we were able to write to a private
        // member variable of Bar, a huge security problem!
        int curI = u1.o.o.getI();

        Console.WriteLine("AFTER: u1.o.o.getI(): {0}.  (BUG if 42)", curI);
    }