Please do not reply to this email- if you want to comment on the bug, go to the URL shown below and enter your comments there.
Changed by [EMAIL PROTECTED] http://bugzilla.ximian.com/show_bug.cgi?id=76599 --- shadow/76599 2005-10-30 11:55:52.000000000 -0500 +++ shadow/76599.tmp.10189 2005-10-30 11:55:52.000000000 -0500 @@ -0,0 +1,92 @@ +Bug#: 76599 +Product: Mono: Compilers +Version: 1.1 +OS: +OS Details: +Status: NEW +Resolution: +Severity: +Priority: Normal +Component: C# +AssignedTo: [EMAIL PROTECTED] +ReportedBy: [EMAIL PROTECTED] +QAContact: [EMAIL PROTECTED] +TargetMilestone: --- +URL: +Cc: +Summary: C# 2.0 fixed size buffers treated as memory-position-fixed + +Description of Problem: + +The current SVN MONO treats fixed size buffers as if their memory position +was fixed which is incorrect. If we compile the following code in MONO: + +public unsafe struct B +{ + private fixed int a[5]; + + public void Foo() + { + int* x = &a[0]; /* No fixed statement required -> BUG */ + + /* Some code that can trigger GC collection */ + System.GC.Collect (); + + System.Console.WriteLine("pointer: "+(ulong)x); + System.Console.WriteLine("pointer: "+(ulong)&a[0]); + } +} + +Compiler does not require usage of 'fixed' statement when creating pointer +from fixed size buffer 'a' which is a bug, because the structure may be +contained in class which is subject to relocation by GC. When the resulting +code is run on MSFT .NET framework, we can easily get the above code write +pointers to different memory locations. + +Furthermore, if we try to compile the following code: + +public unsafe class C +{ + private B x; + + public void Goo() + { + x.Foo(); + + fixed(B* y=&x) + { + } + } +} + +The compiler throws an exception: + +Exception caught by the compiler while compiling: + Block that caused the problem begin at: a.cs(20,15): +System.InvalidCastException: Cannot cast from source type to destination type. + +Unhandled Exception: System.InvalidCastException: Cannot cast from source +type to destination type. +in <0x001e5> Mono.CSharp.TypeManager:IsUnmanagedType (System.Type t) +in <0x00016> Mono.CSharp.TypeManager:VerifyUnManaged (System.Type t, +Location loc) +in <0x00144> Mono.CSharp.ComposedCast:DoResolveAsTypeStep +(Mono.CSharp.EmitContext ec) +in <0x0002d> Mono.CSharp.TypeExpr:ResolveAsTypeStep +(Mono.CSharp.EmitContext ec, Boolean silent) +in <0x0004e> Mono.CSharp.Expression:ResolveAsTypeTerminal +(Mono.CSharp.EmitContext ec, Boolean silent) +in <0x0003c> Mono.CSharp.LocalInfo:Resolve (Mono.CSharp.EmitContext ec) +in <0x00194> Mono.CSharp.Block:ResolveMeta (Mono.CSharp.ToplevelBlock +toplevel, Mono.CSharp.EmitContext ec, Mono.CSharp.InternalParameters ip) +in <0x00967> Mono.CSharp.Block:ResolveMeta (Mono.CSharp.ToplevelBlock +toplevel, Mono.CSharp.EmitContext ec, Mono.CSharp.InternalParameters ip) +in <0x00056> Mono.CSharp.ToplevelBlock:ResolveMeta (Mono.CSharp.EmitContext +ec, Mono.CSharp.InternalParameters ip) +in <0x0010a> Mono.CSharp.EmitContext:ResolveTopBlock +(Mono.CSharp.EmitContext anonymous_method_host, Mono.CSharp.ToplevelBlock +block, Mono.CSharp.InternalParameters ip, IMethodData md, System.Boolean +unreachable) + +If we comment out the fixed() statement, no exception is thrown and the +code compiles. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
