Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. class Base { }
  5. class Derived : Base
  6. {
  7. // 1個や2個だと「たまたま0詰め」な領域を指すかもしれないので無駄にたくさんフィールド並べる
  8. public long A { get; }
  9. public long B { get; }
  10. public long C { get; }
  11. public long D { get; }
  12.  
  13. public (long, long, long, long) T => (A, B, C, D);
  14. }
  15.  
  16. [StructLayout(LayoutKind.Explicit)]
  17. struct Union
  18. {
  19. [FieldOffset(0)]
  20. public Base Base;
  21.  
  22. [FieldOffset(0)]
  23. public Derived Derived;
  24. }
  25.  
  26. class Program
  27. {
  28. // 本来やってはいけないダウンキャスト
  29. static Derived AsDerived(Base b)
  30. {
  31. var u = new Union();
  32. u.Base = b;
  33. return u.Derived;
  34. }
  35.  
  36. static void Main()
  37. {
  38. var b = new Base();
  39.  
  40. // やってはいけないダウンキャストを強行
  41. var d = AsDerived(b);
  42.  
  43. // Derived な変数に Base が入ってる
  44. Console.WriteLine(d.GetType());
  45.  
  46. // Derived にしかないはずのメンバーを読み出し
  47. // (0, 0, 140708363800272, 0) みたいな身に覚えのない値が取れる
  48. // 読めるだけならいいけど書き換えもできるんでさらにまずい(GC クラッシュ & セキュリティ ホール)
  49. Console.WriteLine(d.T);
  50. }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement