summaryrefslogtreecommitdiff
path: root/exp-sgcheck/tests/unaligned.c
diff options
context:
space:
mode:
Diffstat (limited to 'exp-sgcheck/tests/unaligned.c')
-rw-r--r--exp-sgcheck/tests/unaligned.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/exp-sgcheck/tests/unaligned.c b/exp-sgcheck/tests/unaligned.c
new file mode 100644
index 00000000..6c7ba39d
--- /dev/null
+++ b/exp-sgcheck/tests/unaligned.c
@@ -0,0 +1,51 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main ( void )
+{
+ char* x = strdup("hello");
+ char c __attribute__((unused));
+ char c0[8], c1[8], c2[8], c3[8], c4[8];
+
+ // Each of these pointers has a different alignment
+ char** p0 = (char**)&c0[0]; char** p1 = (char**)&c1[1];
+ char** p2 = (char**)&c2[2]; char** p3 = (char**)&c3[3];
+ char** p4 = (char**)&c4[4];
+ *p0 = x; *p1 = x; *p2 = x;
+ *p3 = x; *p4 = x;
+
+ // These 10 are ok
+ c = (*p0)[0];
+ c = (*p1)[0];
+ c = (*p2)[0];
+ c = (*p3)[0];
+ c = (*p4)[0];
+
+ c = (*p0)[5];
+ c = (*p1)[5];
+ c = (*p2)[5];
+ c = (*p3)[5];
+ c = (*p4)[5];
+
+ // These 10 are bad
+ c = (*p0)[-1]; // always word aligned, so det
+ c = (*p1)[-1]; // undet
+ c = (*p2)[-1]; // undet
+ c = (*p3)[-1]; // undet
+ c = (*p4)[-1]; // undet on 64-bit since not 64-bit aligned
+
+ c = (*p0)[6]; // always word aligned, so det
+ c = (*p1)[6]; // undet
+ c = (*p2)[6]; // undet
+ c = (*p3)[6]; // undet
+ c = (*p4)[6]; // undet on 64-bit since not 64-bit aligned
+
+ return 0;
+}
+
+/* What this program does: verifies that (unfortunately) if you store a
+ pointer misaligned, then the associated shadow value decays to Unknown,
+ and so when you retrieve the pointer later and dereference it, you
+ get no check :-( */