From 8c79eb836c6002203dd04aa26d53ae73abe73702 Mon Sep 17 00:00:00 2001 From: Niels Grewe Date: Tue, 8 Nov 2016 12:31:23 +0000 Subject: [PATCH 1/2] Test case for misaligned ivars. --- Test/alignTest.m | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Test/alignTest.m b/Test/alignTest.m index b0f8deb..b33f760 100644 --- a/Test/alignTest.m +++ b/Test/alignTest.m @@ -52,8 +52,32 @@ typedef int v4si __attribute__ ((vector_size (16))); } @end +#if __has_attribute(objc_root_class) +__attribute__((objc_root_class)) +#endif +@interface StringLikeTest +{ + Class isa; + char* c_string; + int len; +} +@end + +@implementation StringLikeTest ++ (Class)class +{ + return self; +} +@end + int main(void) { [[Vector alloc] permute]; [[Foo new] check]; + + Ivar v_isa = class_getInstanceVariable([StringLikeTest class], "isa"); + Ivar v_c_string = class_getInstanceVariable([StringLikeTest class], "c_string"); + Ivar v_len = class_getInstanceVariable([StringLikeTest class], "len"); + assert(ivar_getOffset(v_isa) < ivar_getOffset(v_c_string)); + assert(ivar_getOffset(v_c_string) < ivar_getOffset(v_len)); } From 165f1e83bfff3784599fa31799b7bd4b418ee62f Mon Sep 17 00:00:00 2001 From: Niels Grewe Date: Tue, 8 Nov 2016 14:40:59 +0100 Subject: [PATCH 2/2] Additional asserts Assert that the offset of `isa` is 0 and the offset of `c_string` is `sizeof(Class)` --- Test/alignTest.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Test/alignTest.m b/Test/alignTest.m index b33f760..aa636e1 100644 --- a/Test/alignTest.m +++ b/Test/alignTest.m @@ -78,6 +78,10 @@ int main(void) Ivar v_isa = class_getInstanceVariable([StringLikeTest class], "isa"); Ivar v_c_string = class_getInstanceVariable([StringLikeTest class], "c_string"); Ivar v_len = class_getInstanceVariable([StringLikeTest class], "len"); - assert(ivar_getOffset(v_isa) < ivar_getOffset(v_c_string)); - assert(ivar_getOffset(v_c_string) < ivar_getOffset(v_len)); + ptrdiff_t o_isa = ivar_getOffset(v_isa); + ptrdiff_t o_c_string = ivar_getOffset(v_c_string); + assert(o_isa == 0); + assert(o_c_string == sizeof(Class)); + assert(o_isa < o_c_string); + assert(o_c_string < ivar_getOffset(v_len)); }