Ayende @ Rahien

It's a girl

Can you hack this out? Hint #1

Here is another challenge, smaller, this time, which can lead you the right path.  And yes, it is a screwy one.

All you have to do is make the following assertion fail.

public class Program
{
private static void Main(string[] args)
{
CanThisHappen<MyFunnyType>();
}

public static void CanThisHappen<T>() where T : class, new()
{
var instnace = new T();
Debug.Assert(instnace != null,"How did we break the CLR?");
}
}

The rules are simple, you are not allowed to do anything outside the current process. That means that profiling API, post compilation assembly rewrite, etc are forbidden. Anything else is a fair game.

I will let you know that I can make the assertion fail in 4 lines of code :-)

Comments

hazzik
11/25/2009 10:33 AM by
hazzik

perhaps like this:

public class Program {

private static void Main() {

    CanThisHappen

<myfunnytype();

}


public static void CanThisHappen

<t() where T : class, new() {

    var instnace = new T();

    Debug.Assert(!instnace.Equals(null), "How did we break the CLR?");

    }

}

internal class MyFunnyType {

public override bool Equals(object obj) {

    return true;

}

}

Ayende Rahien
11/25/2009 10:39 AM by
Ayende Rahien

Hazzik,

That would work, yes, but that doesn't match the challenge that I set.

hazzik
11/25/2009 10:43 AM by
hazzik

Can we modify CanThisHappen method of program?

Marc Gravell
11/25/2009 10:46 AM by
Marc Gravell

class MyFunnyTypeAttribute : ProxyAttribute {

public override MarshalByRefObject CreateInstance(Type serverType) { return null; }

}

[MyFunnyType] class MyFunnyType : ContextBoundObject{}

Ayende Rahien
11/25/2009 10:53 AM by
Ayende Rahien

Marc,

:-)

Yeah.

Once the previous hack was solved, this is pretty easy.

Dennis
11/25/2009 11:00 AM by
Dennis

Do you mean to break

var instnace = new <whatever;

object.ReferenceEquals(instnace, null) == false?

Dennis
11/25/2009 11:14 AM by
Dennis

Damn, thats a NASTY solution :S

liviu
11/25/2009 11:58 AM by
liviu

I did not know that ProxyAttribute exists :)

It opens so many possibilities!!!

Reshef Mann
11/25/2009 01:37 PM by
Reshef Mann

Apparently this will do the trick:

        public static bool operator !=(object left, MyFunnyType right)

        {

            return false;

        }
Ayende Rahien
11/25/2009 01:41 PM by
Ayende Rahien

Reshef,

Try that, it won't work :-)

Reshef
11/25/2009 01:55 PM by
Reshef

Right. When creating the object with new T() somehow the type is unknown and it won't call the != operator. Generics oddity...

Marc Gravell
11/25/2009 03:02 PM by
Marc Gravell

@Reshef - it isn't that the T is unknown; it is that the operator can't be resolved via static analysis (which it must) to a single implementation. Similar to how +-*/ don't work (unless you cheat, like in MiscUtil's Operator class). I suspect there is some scenarios (involving subclassing and a constraint like T : SomeType) where it /would/ pick up the operator, but that ("T : SomeType") isn't in the question.

Wil
11/25/2009 03:48 PM by
Wil

Looks like this would work.

public class InterceptionProxy : RealProxy

{

    public InterceptionProxy() : base(typeof(MyFunnyType)) { }


     public override IMessage Invoke(IMessage msg)

    {

         // Does not get here

          ....

    }


    public override object GetTransparentProxy()

    {

        return null;

    }

}

Chris Wright
11/28/2009 02:34 PM by
Chris Wright

I've used a programming language in which you can return a value from a constructor, even null. Insanity :)

Mark Rogers
11/30/2009 03:17 PM by
Mark Rogers

Cool post, I hate to say but I think you misspelled 'instance' as 'instnace' in your code example.

Peace!

Avish
11/30/2009 09:08 PM by
Avish

Ooh, nice solution. I was thinking about this:

using MyFunnyType = System.Nullable <int;

As far as I recall, Nullable structs are not applicable for the "struct" constraint (which is actually defined as "non-nullable value type"), so I guess they might be applicable for the "class" constraint. I'm probably wrong, but it'd be a nice solution.

Comments have been closed on this topic.