summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormartynas <martynas@openbsd.org>2013-12-28 02:14:32 +0000
committermartynas <martynas@openbsd.org>2013-12-28 02:14:32 +0000
commite6e6dad3324a03134a8814e18ccd61c3a7190a0a (patch)
tree4540592996dcd13a94f26dcf2b0b0a04b201490c
parentAnnotate a few more bounded functions: realpath(3) needs a buffer (diff)
downloadwireguard-openbsd-e6e6dad3324a03134a8814e18ccd61c3a7190a0a.tar.xz
wireguard-openbsd-e6e6dad3324a03134a8814e18ccd61c3a7190a0a.zip
Add regression tests to check whether GCC folds unsafe builtins and
actually shows the security warning. Also add some other cases where GCC used to yield the warning but shouldn't (e.g. strncat simplified into strcat).
-rw-r--r--regress/gnu/egcs/Makefile3
-rw-r--r--regress/gnu/egcs/gcc-builtins/Makefile26
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-1.c13
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-1.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-2.c12
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-2.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-3.c12
-rw-r--r--regress/gnu/egcs/gcc-builtins/sprintf-3.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/stpcpy-1.c13
-rw-r--r--regress/gnu/egcs/gcc-builtins/stpcpy-1.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/stpcpy-2.c12
-rw-r--r--regress/gnu/egcs/gcc-builtins/stpcpy-2.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcat-1.c13
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcat-1.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcat-2.c12
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcat-2.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcpy-1.c13
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcpy-1.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcpy-2.c12
-rw-r--r--regress/gnu/egcs/gcc-builtins/strcpy-2.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/strncat-1.c13
-rw-r--r--regress/gnu/egcs/gcc-builtins/strncat-1.c.exp0
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-1.c25
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-1.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-2.c25
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-2.c.exp2
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-3.c25
-rw-r--r--regress/gnu/egcs/gcc-builtins/vsprintf-3.c.exp2
28 files changed, 252 insertions, 1 deletions
diff --git a/regress/gnu/egcs/Makefile b/regress/gnu/egcs/Makefile
index a7f3c47e707..962ff9d1188 100644
--- a/regress/gnu/egcs/Makefile
+++ b/regress/gnu/egcs/Makefile
@@ -1,9 +1,10 @@
-# $OpenBSD: Makefile,v 1.6 2013/08/01 21:26:30 kettenis Exp $
+# $OpenBSD: Makefile,v 1.7 2013/12/28 02:14:32 martynas Exp $
SUBDIR+= gcc libiberty
.if defined(REGRESS_FULL)
SUBDIR += gcc-bounds
+SUBDIR += gcc-builtins
.endif
install:
diff --git a/regress/gnu/egcs/gcc-builtins/Makefile b/regress/gnu/egcs/gcc-builtins/Makefile
new file mode 100644
index 00000000000..ecfb1d35239
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/Makefile
@@ -0,0 +1,26 @@
+# $OpenBSD: Makefile,v 1.1 2013/12/28 02:14:32 martynas Exp $
+
+GCC_BUILTINS= sprintf-1 sprintf-2 sprintf-3 stpcpy-1 stpcpy-2 strcat-1 \
+ strcat-2 strcpy-1 strcpy-2 strncat-1 vsprintf-1 vsprintf-2 \
+ vsprintf-3
+
+TCC= gcc
+TCFLAGS= -O2
+TCXXFLAGS= ${TCFLAGS}
+
+.for i in ${GCC_BUILTINS}
+REGRESS_TARGETS+= c-${i}
+c-${i}:
+ ${TCC} ${TCFLAGS} -o /dev/null ${i}.c 2>&1 | cut -d: -f2- | diff -u - ${.CURDIR}/${i}.c.exp
+.endfor
+
+generate:
+.for i in ${REGRESS_TARGETS}
+ -${TCC} ${TCFLAGS} -o /dev/null ${i:C/^c-//g}.c 2>&1 | cut -d: -f2- >${i:C/^c-//g}.c.exp
+.endfor
+
+.PHONY: ${REGRESS_TARGETS} generate regress
+
+NOOBJ= Yes
+
+.include <bsd.regress.mk>
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-1.c b/regress/gnu/egcs/gcc-builtins/sprintf-1.c
new file mode 100644
index 00000000000..6294490d438
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-1.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[512];
+ volatile int rv;
+
+ /* This expression cannot be folded. */
+ rv = sprintf(buf, "%s", argv[0]);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-1.c.exp b/regress/gnu/egcs/gcc-builtins/sprintf-1.c.exp
new file mode 100644
index 00000000000..6d3879edbd3
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-1.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: sprintf() is often misused, please use snprintf()
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-2.c b/regress/gnu/egcs/gcc-builtins/sprintf-2.c
new file mode 100644
index 00000000000..49974e1db4a
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-2.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[10];
+
+ /* This expression can be folded. */
+ sprintf(buf, "%s", "foo");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-2.c.exp b/regress/gnu/egcs/gcc-builtins/sprintf-2.c.exp
new file mode 100644
index 00000000000..6d3879edbd3
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-2.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: sprintf() is often misused, please use snprintf()
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-3.c b/regress/gnu/egcs/gcc-builtins/sprintf-3.c
new file mode 100644
index 00000000000..cac6fa0d5fe
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-3.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[10];
+
+ /* This expression can be folded. */
+ sprintf(buf, "baz");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/sprintf-3.c.exp b/regress/gnu/egcs/gcc-builtins/sprintf-3.c.exp
new file mode 100644
index 00000000000..6d3879edbd3
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/sprintf-3.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: sprintf() is often misused, please use snprintf()
diff --git a/regress/gnu/egcs/gcc-builtins/stpcpy-1.c b/regress/gnu/egcs/gcc-builtins/stpcpy-1.c
new file mode 100644
index 00000000000..d9506280903
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/stpcpy-1.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[512];
+ volatile char *rv;
+
+ /* This expression cannot be folded. */
+ rv = stpcpy(buf, argv[0]);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/stpcpy-1.c.exp b/regress/gnu/egcs/gcc-builtins/stpcpy-1.c.exp
new file mode 100644
index 00000000000..ef88ade942d
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/stpcpy-1.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: stpcpy() is dangerous GNU crap; don't use it
diff --git a/regress/gnu/egcs/gcc-builtins/stpcpy-2.c b/regress/gnu/egcs/gcc-builtins/stpcpy-2.c
new file mode 100644
index 00000000000..5700ea99952
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/stpcpy-2.c
@@ -0,0 +1,12 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[10];
+
+ /* This expression can be folded. */
+ stpcpy(buf, "foo");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/stpcpy-2.c.exp b/regress/gnu/egcs/gcc-builtins/stpcpy-2.c.exp
new file mode 100644
index 00000000000..ef88ade942d
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/stpcpy-2.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: stpcpy() is dangerous GNU crap; don't use it
diff --git a/regress/gnu/egcs/gcc-builtins/strcat-1.c b/regress/gnu/egcs/gcc-builtins/strcat-1.c
new file mode 100644
index 00000000000..3694d7c2324
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcat-1.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[512];
+ volatile char *rv;
+
+ /* This expression cannot be folded. */
+ rv = strcat(buf, argv[0]);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/strcat-1.c.exp b/regress/gnu/egcs/gcc-builtins/strcat-1.c.exp
new file mode 100644
index 00000000000..e0fe608bca9
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcat-1.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: strcat() is almost always misused, please use strlcat()
diff --git a/regress/gnu/egcs/gcc-builtins/strcat-2.c b/regress/gnu/egcs/gcc-builtins/strcat-2.c
new file mode 100644
index 00000000000..52364a7018c
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcat-2.c
@@ -0,0 +1,12 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[10];
+
+ /* This expression can be folded. */
+ strcat(buf, "foo");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/strcat-2.c.exp b/regress/gnu/egcs/gcc-builtins/strcat-2.c.exp
new file mode 100644
index 00000000000..e0fe608bca9
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcat-2.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: strcat() is almost always misused, please use strlcat()
diff --git a/regress/gnu/egcs/gcc-builtins/strcpy-1.c b/regress/gnu/egcs/gcc-builtins/strcpy-1.c
new file mode 100644
index 00000000000..1c87e6aa50a
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcpy-1.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[512];
+ volatile char *rv;
+
+ /* This expression cannot be folded. */
+ rv = strcpy(buf, argv[0]);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/strcpy-1.c.exp b/regress/gnu/egcs/gcc-builtins/strcpy-1.c.exp
new file mode 100644
index 00000000000..2528526b848
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcpy-1.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: strcpy() is almost always misused, please use strlcpy()
diff --git a/regress/gnu/egcs/gcc-builtins/strcpy-2.c b/regress/gnu/egcs/gcc-builtins/strcpy-2.c
new file mode 100644
index 00000000000..3862ff16ff6
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcpy-2.c
@@ -0,0 +1,12 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char buf[10];
+
+ /* This expression can be folded. */
+ strcpy(buf, "foo");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/strcpy-2.c.exp b/regress/gnu/egcs/gcc-builtins/strcpy-2.c.exp
new file mode 100644
index 00000000000..2528526b848
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strcpy-2.c.exp
@@ -0,0 +1,2 @@
+ In function `main':
+ warning: strcpy() is almost always misused, please use strlcpy()
diff --git a/regress/gnu/egcs/gcc-builtins/strncat-1.c b/regress/gnu/egcs/gcc-builtins/strncat-1.c
new file mode 100644
index 00000000000..389dd3fc7d0
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strncat-1.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ char foo[10];
+ const char bar[] = "bar";
+
+ /* The compiler should not simplify this into strcat. */
+ strncat(foo, bar, sizeof(foo));
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/strncat-1.c.exp b/regress/gnu/egcs/gcc-builtins/strncat-1.c.exp
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/strncat-1.c.exp
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-1.c b/regress/gnu/egcs/gcc-builtins/vsprintf-1.c
new file mode 100644
index 00000000000..f0a4340e39f
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-1.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+void
+test_vsprintf(int unused, ...)
+{
+ char buf[512];
+ volatile int rv;
+ va_list ap;
+
+ va_start(ap, unused);
+
+ /* This expression cannot be folded. */
+ rv = vsprintf(buf, "%s", ap);
+
+ va_end(ap);
+}
+
+int
+main(int argc, char **argv)
+{
+ test_vsprintf(0, argv[0]);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-1.c.exp b/regress/gnu/egcs/gcc-builtins/vsprintf-1.c.exp
new file mode 100644
index 00000000000..836db0696bc
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-1.c.exp
@@ -0,0 +1,2 @@
+ In function `test_vsprintf':
+ warning: vsprintf() is often misused, please use vsnprintf()
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-2.c b/regress/gnu/egcs/gcc-builtins/vsprintf-2.c
new file mode 100644
index 00000000000..fc8c77260c4
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-2.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+void
+test_vsprintf(int unused, ...)
+{
+ char buf[10];
+ volatile int rv;
+ va_list ap;
+
+ va_start(ap, unused);
+
+ /* This expression can be folded. */
+ rv = vsprintf(buf, "%s", ap);
+
+ va_end(ap);
+}
+
+int
+main(int argc, char **argv)
+{
+ test_vsprintf(0, "foo");
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-2.c.exp b/regress/gnu/egcs/gcc-builtins/vsprintf-2.c.exp
new file mode 100644
index 00000000000..836db0696bc
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-2.c.exp
@@ -0,0 +1,2 @@
+ In function `test_vsprintf':
+ warning: vsprintf() is often misused, please use vsnprintf()
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-3.c b/regress/gnu/egcs/gcc-builtins/vsprintf-3.c
new file mode 100644
index 00000000000..a0d5b9e3b5d
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-3.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+void
+test_vsprintf(int unused, ...)
+{
+ char buf[10];
+ volatile int rv;
+ va_list ap;
+
+ va_start(ap, unused);
+
+ /* This expression can be folded. */
+ rv = vsprintf(buf, "bar", ap);
+
+ va_end(ap);
+}
+
+int
+main(int argc, char **argv)
+{
+ test_vsprintf(0);
+
+ return (1);
+}
diff --git a/regress/gnu/egcs/gcc-builtins/vsprintf-3.c.exp b/regress/gnu/egcs/gcc-builtins/vsprintf-3.c.exp
new file mode 100644
index 00000000000..836db0696bc
--- /dev/null
+++ b/regress/gnu/egcs/gcc-builtins/vsprintf-3.c.exp
@@ -0,0 +1,2 @@
+ In function `test_vsprintf':
+ warning: vsprintf() is often misused, please use vsnprintf()