diff options
author | Martynas Venckus <martynas@cvs.openbsd.org> | 2013-12-28 02:14:33 +0000 |
---|---|---|
committer | Martynas Venckus <martynas@cvs.openbsd.org> | 2013-12-28 02:14:33 +0000 |
commit | c639aa8fff0ddf4a97eebfacc435c2c44b1c316f (patch) | |
tree | 329af5562eb85f0e0a5d8e30d6317a0d662c1ef9 /regress | |
parent | 71e30afaecd3a65722d13c869cf0c018c37621eb (diff) |
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).
Diffstat (limited to 'regress')
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() |