FLEXRuntimeSafety.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // FLEXRuntimeSafety.m
  3. // FLEX
  4. //
  5. // Created by Tanner on 3/25/17.
  6. //
  7. #import "FLEXRuntimeSafety.h"
  8. NSUInteger const kFLEXKnownUnsafeClassCount = 19;
  9. Class * _UnsafeClasses = NULL;
  10. CFSetRef FLEXKnownUnsafeClasses = nil;
  11. #define FLEXClassPointerOrCFNull(name) \
  12. (NSClassFromString(name) ?: (__bridge id)kCFNull)
  13. __attribute__((constructor))
  14. void FLEXRuntimeSafteyInit() {
  15. FLEXKnownUnsafeClasses = CFSetCreate(
  16. kCFAllocatorDefault,
  17. (const void **)(uintptr_t)FLEXKnownUnsafeClassList(),
  18. kFLEXKnownUnsafeClassCount,
  19. nil
  20. );
  21. }
  22. const Class * FLEXKnownUnsafeClassList() {
  23. if (!_UnsafeClasses) {
  24. const Class ignored[] = {
  25. FLEXClassPointerOrCFNull(@"__ARCLite__"),
  26. FLEXClassPointerOrCFNull(@"__NSCFCalendar"),
  27. FLEXClassPointerOrCFNull(@"__NSCFTimer"),
  28. FLEXClassPointerOrCFNull(@"NSCFTimer"),
  29. FLEXClassPointerOrCFNull(@"__NSGenericDeallocHandler"),
  30. FLEXClassPointerOrCFNull(@"NSAutoreleasePool"),
  31. FLEXClassPointerOrCFNull(@"NSPlaceholderNumber"),
  32. FLEXClassPointerOrCFNull(@"NSPlaceholderString"),
  33. FLEXClassPointerOrCFNull(@"NSPlaceholderValue"),
  34. FLEXClassPointerOrCFNull(@"Object"),
  35. FLEXClassPointerOrCFNull(@"VMUArchitecture"),
  36. FLEXClassPointerOrCFNull(@"JSExport"),
  37. FLEXClassPointerOrCFNull(@"__NSAtom"),
  38. FLEXClassPointerOrCFNull(@"_NSZombie_"),
  39. FLEXClassPointerOrCFNull(@"_CNZombie_"),
  40. FLEXClassPointerOrCFNull(@"__NSMessage"),
  41. FLEXClassPointerOrCFNull(@"__NSMessageBuilder"),
  42. FLEXClassPointerOrCFNull(@"FigIrisAutoTrimmerMotionSampleExport"),
  43. // Temporary until we have our own type encoding parser;
  44. // setVectors: has an invalid type encoding and crashes NSMethodSignature
  45. FLEXClassPointerOrCFNull(@"_UIPointVector"),
  46. };
  47. assert((sizeof(ignored) / sizeof(Class)) == kFLEXKnownUnsafeClassCount);
  48. _UnsafeClasses = (Class *)malloc(sizeof(ignored));
  49. memcpy(_UnsafeClasses, ignored, sizeof(ignored));
  50. }
  51. return _UnsafeClasses;
  52. }
  53. NSSet * FLEXKnownUnsafeClassNames() {
  54. static NSSet *set = nil;
  55. if (!set) {
  56. NSArray *ignored = @[
  57. @"__ARCLite__",
  58. @"__NSCFCalendar",
  59. @"__NSCFTimer",
  60. @"NSCFTimer",
  61. @"__NSGenericDeallocHandler",
  62. @"NSAutoreleasePool",
  63. @"NSPlaceholderNumber",
  64. @"NSPlaceholderString",
  65. @"NSPlaceholderValue",
  66. @"Object",
  67. @"VMUArchitecture",
  68. @"JSExport",
  69. @"__NSAtom",
  70. @"_NSZombie_",
  71. @"_CNZombie_",
  72. @"__NSMessage",
  73. @"__NSMessageBuilder",
  74. @"FigIrisAutoTrimmerMotionSampleExport",
  75. @"_UIPointVector",
  76. ];
  77. set = [NSSet setWithArray:ignored];
  78. assert(set.count == kFLEXKnownUnsafeClassCount);
  79. }
  80. return set;
  81. }