diff options
author | Gerald Pfeifer <gerald@FreeBSD.org> | 2014-06-10 02:11:30 +0000 |
---|---|---|
committer | Gerald Pfeifer <gerald@FreeBSD.org> | 2014-06-10 02:11:30 +0000 |
commit | 12e97d403528e326d5c263acce358c27bfa3074f (patch) | |
tree | a6870cb4d5ef01fe5fe2b62f8d56d2266c46ee5a /lang/gcc48/files/patch-stackprotector-gcc_testsuite | |
parent | Reset maintainer at his request. Maintainer recommends P. Selinger's (diff) |
Update to the 20140605 snapshot of GCC 4.8.4.
Add support for "-fstack-protector-strong". This extends the
WITH_SSP_PORTS Makefile option in FreeBSD which adds "-fstack-protector"
and "-fstack-protector-all" command-line options that add extra code to
check for buffer overflows to ports built that way, cf.
https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Optimize-Options.html
While this was a good first step, those switches offer too little
protection or too much overhead and so Google contributed a balanced
"-fstack-protector-strong". [1]
PR: 186852 [1]
Submitted by: software-freebsd@interfasys.ch [1]
Diffstat (limited to 'lang/gcc48/files/patch-stackprotector-gcc_testsuite')
-rw-r--r-- | lang/gcc48/files/patch-stackprotector-gcc_testsuite | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/lang/gcc48/files/patch-stackprotector-gcc_testsuite b/lang/gcc48/files/patch-stackprotector-gcc_testsuite new file mode 100644 index 000000000000..443a7b4ef893 --- /dev/null +++ b/lang/gcc48/files/patch-stackprotector-gcc_testsuite @@ -0,0 +1,176 @@ +--- /dev/null ++++ gcc/testsuite/g++.dg/fstack-protector-strong.C +@@ -0,0 +1,35 @@ ++/* Test that stack protection is done on chosen functions. */ ++ ++/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ ++/* { dg-options "-O2 -fstack-protector-strong" } */ ++ ++class A ++{ ++public: ++ A() {} ++ ~A() {} ++ void method(); ++ int state; ++}; ++ ++/* Frame address exposed to A::method via "this". */ ++int ++foo1 () ++{ ++ A a; ++ a.method (); ++ return a.state; ++} ++ ++/* Possible destroying foo2's stack via &a. */ ++int ++global_func (A& a); ++ ++/* Frame address exposed to global_func. */ ++int foo2 () ++{ ++ A a; ++ return global_func (a); ++} ++ ++/* { dg-final { scan-assembler-times "stack_chk_fail" 2 } } */ +--- /dev/null ++++ gcc/testsuite/gcc.dg/fstack-protector-strong.c +@@ -0,0 +1,135 @@ ++/* Test that stack protection is done on chosen functions. */ ++ ++/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ ++/* { dg-options "-O2 -fstack-protector-strong" } */ ++ ++#include<string.h> ++#include<stdlib.h> ++ ++extern int g0; ++extern int* pg0; ++int ++goo (int *); ++int ++hoo (int); ++ ++/* Function frame address escaped function call. */ ++int ++foo1 () ++{ ++ int i; ++ return goo (&i); ++} ++ ++struct ArrayStruct ++{ ++ int a; ++ int array[10]; ++}; ++ ++struct AA ++{ ++ int b; ++ struct ArrayStruct as; ++}; ++ ++/* Function frame contains array. */ ++int ++foo2 () ++{ ++ struct AA aa; ++ int i; ++ for (i = 0; i < 10; ++i) ++ { ++ aa.as.array[i] = i * (i-1) + i / 2; ++ } ++ return aa.as.array[5]; ++} ++ ++/* Address computation based on a function frame address. */ ++int ++foo3 () ++{ ++ int a; ++ int *p; ++ p = &a + 5; ++ return goo (p); ++} ++ ++/* Address cast based on a function frame address. */ ++int ++foo4 () ++{ ++ int a; ++ return goo (g0 << 2 ? (int *)(3 * (long)(void *)(&a)) : 0); ++} ++ ++/* Address cast based on a local array. */ ++int ++foo5 () ++{ ++ short array[10]; ++ return goo ((int *)(array + 5)); ++} ++ ++struct BB ++{ ++ int one; ++ int two; ++ int three; ++}; ++ ++/* Address computaton based on a function frame address.*/ ++int ++foo6 () ++{ ++ struct BB bb; ++ return goo (&bb.one + sizeof(int)); ++} ++ ++/* Function frame address escaped via global variable. */ ++int ++foo7 () ++{ ++ int a; ++ pg0 = &a; ++ goo (pg0); ++ return *pg0; ++} ++ ++/* Check that this covers -fstack-protector. */ ++int ++foo8 () ++{ ++ char base[100]; ++ memcpy ((void *)base, (const void *)pg0, 105); ++ return (int)(base[32]); ++} ++ ++/* Check that this covers -fstack-protector. */ ++int ++foo9 () ++{ ++ char* p = alloca (100); ++ return goo ((int *)(p + 50)); ++} ++ ++int ++global2 (struct BB* pbb); ++ ++/* Address taken on struct. */ ++int ++foo10 () ++{ ++ struct BB bb; ++ int i; ++ bb.one = global2 (&bb); ++ for (i = 0; i < 10; ++i) ++ { ++ bb.two = bb.one + bb.two; ++ bb.three = bb.one + bb.two + bb.three; ++ } ++ return bb.three; ++} ++ ++/* { dg-final { scan-assembler-times "stack_chk_fail" 10 } } */ |