summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr38902.c
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gcc.dg/pr38902.c
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr38902.c')
-rw-r--r--gcc/testsuite/gcc.dg/pr38902.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr38902.c b/gcc/testsuite/gcc.dg/pr38902.c
new file mode 100644
index 000000000..d40652624
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr38902.c
@@ -0,0 +1,131 @@
+/* PR target/38902 */
+/* { dg-do run } */
+/* { dg-options "-O2 -fstack-protector" } */
+/* { dg-require-effective-target fstack_protector } */
+
+#ifdef DEBUG
+#include <stdio.h>
+#define debug(format, args...) printf (format , ## args)
+#else
+extern int sprintf (char *, const char *, ...);
+#define debug(format, args...)
+#endif
+
+extern void abort (void);
+
+/*
+
+Copyright (C) 2009 Canonical, Ltd.
+Author: Kees Cook <kees@ubuntu.com>
+License: GPLv3
+
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38616
+https://bugs.launchpad.net/ubuntu/+source/gcc-4.3/+bug/316019
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38902
+
+gcc -O2 -fstack-protector truncate.c -o truncate
+
+ Broken:
+
+ Only the first operation fails, so create a new function for each test.
+ Source must be local (literal or stack)
+
+ __builtin_memmove
+ __builtin_memcpy
+ __builtin_strcpy (optimized to __builtin_memcpy?)
+ sprintf (direct) (optmized to __builtin_strcpy?)
+ sprintf (via %s) (optmized to __builtin_strcpy?)
+
+ OK:
+ __builtin_strcat
+ sprintf (complex format)
+
+ */
+
+char *heap = "1234567890abcdefghijklmnopqrstuvwxyz";
+
+int failed = 0;
+
+#define CHECK(count, a...) \
+void test##count (void) \
+{ \
+ char *local = "1234567890abcdefghijklmnopqrstuvwxyz"; \
+ char buffer[1024]=""; \
+ a; \
+ if (__builtin_strcmp(buffer, heap) == 0) { \
+ debug("Okay(%d):\n\t%s\n", count, # a); \
+ } \
+ else { \
+ debug("Failed(%d):\n\t%s\n", count, # a); \
+ failed++; \
+ } \
+}
+
+
+CHECK( 0, __builtin_memcpy (buffer, "1234567890abcdefghijklmnopqrstuvwxyz", __builtin_strlen("1234567890abcdefghijklmnopqrstuvwxyz")+1); );
+CHECK( 1, __builtin_memcpy (buffer, local, __builtin_strlen(local)+1); );
+CHECK( 2, __builtin_memcpy (buffer, heap, __builtin_strlen(heap)+1); );
+
+CHECK( 3, __builtin_memmove (buffer, "1234567890abcdefghijklmnopqrstuvwxyz", __builtin_strlen("1234567890abcdefghijklmnopqrstuvwxyz")+1); );
+CHECK( 4, __builtin_memmove (buffer, local, __builtin_strlen(local)+1); );
+CHECK( 5, __builtin_memmove (buffer, heap, __builtin_strlen(heap)+1); );
+
+CHECK( 6, __builtin_strcpy (buffer, "1234567890abcdefghijklmnopqrstuvwxyz"); );
+CHECK( 7, __builtin_strcpy (buffer, local); );
+CHECK( 8, __builtin_strcpy (buffer, heap); );
+
+CHECK( 9, sprintf (buffer, "1234567890abcdefghijklmnopqrstuvwxyz"); );
+CHECK(10, sprintf (buffer, local); );
+CHECK(11, sprintf (buffer, heap); );
+
+CHECK(12, sprintf (buffer, "%s", "1234567890abcdefghijklmnopqrstuvwxyz"); );
+CHECK(13, sprintf (buffer, "%s", local); );
+CHECK(14, sprintf (buffer, "%s", heap); );
+
+CHECK(15, __builtin_strcat (buffer, "1234567890abcdefghijklmnopqrstuvwxyz"); );
+CHECK(16, __builtin_strcat (buffer, local); );
+CHECK(17, __builtin_strcat (buffer, heap); );
+
+void mongoose(void)
+{
+ char buffer[1024]="";
+ sprintf (buffer, "%s", "1234567890abcdefghijklmnopqrstuvwxyz");;
+ if (__builtin_strcmp(buffer, heap) == 0) {
+ debug("Okay(%d):\n\t%s\n", -1, "sprintf (buffer, \"%s\", \"1234567890abcdefghijklmnopqrstuvwxyz\");");
+ }
+ else {
+ debug("Failed(%d):\n\t%s\n", -1, "sprintf (buffer, \"%s\", \"1234567890abcdefghijklmnopqrstuvwxyz\");");
+ failed++;
+ }
+}
+
+int main (int argc, char *argv[])
+{
+ test0();
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+ test6();
+ test7();
+ test8();
+ test9();
+ test10();
+ test11();
+
+ // wtf, why are these different?!
+ test12();
+ mongoose();
+
+ test13();
+ test14();
+ test15();
+ test16();
+ test17();
+
+ if (failed)
+ abort ();
+
+ return 0;
+}