From patchwork Mon Mar 24 09:37:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 333003 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 05CEF14008B for ; Mon, 24 Mar 2014 22:24:37 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=Z6ntq2hiwz6+ecx9IAjEk2Z+16LwHi9/yJB+sSXqagvgQCMK0NThV U4wJzTvp1LsPv4p3nfIl7joJ9Ezgn4cvYR6hy+fl7sR5nUVelqhoKz6VerCKBFEd /HOAd0V1Lm9xQPUmwCS91U+1TJ7138sxSJzaguCelpsrBkw6LUpUH0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=WsE/rqY86NF8Ic0/9LTE7ZDsN7k=; b=cdEmTS3T3VRvvf7fOGuz nSCKt00zTzunz3Gy5xK+7lcJj1Crk9AA8egg/3cSAbbi3w39ZUfXeOBzdPq7bZL5 5Dr7e1hcA9OuQrRnHFrFjIBgIyoVmZSfSdTRJWRwO4F3fg3B+a34wNbvbKgHN7FF k+0uE1oXkiD4oy0k4wVRbxs= Received: (qmail 7493 invoked by alias); 24 Mar 2014 09:37:55 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 7481 invoked by uid 89); 24 Mar 2014 09:37:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.1 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Mar 2014 09:37:52 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2O9bpB1026824 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 24 Mar 2014 05:37:51 -0400 Received: from redhat.com (ovpn-116-23.ams2.redhat.com [10.36.116.23]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2O9bk85007439 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 24 Mar 2014 05:37:49 -0400 Date: Mon, 24 Mar 2014 10:37:46 +0100 From: Marek Polacek To: GCC Patches Subject: [PATCH] Make some ubsan tests more robust Message-ID: <20140324093746.GP6523@redhat.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) dg-output as it stands can't be used in a negate form, that is we can't check that no output was produced. This is needed for ubsan: there are testcases that when run should issue no output at all. We can, however, use this really ugly hack, where we output some fake stuff at the beginning and at the end of main() and check that nothing was issued in between. And it's even uglier because I need to pull in because of stderr... Fortunately in 5.0 this will not be needed, because I'll implement the -fno-sanitize-recover option (then any runtime error causes the program to abort). Ran ubsan testsuite. Ok for trunk? 2014-03-24 Marek Polacek testsuite/ * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h. Define INT_MIN. * c-c++-common/ubsan/overflow-1.c: Check for unwanted output. * c-c++-common/ubsan/overflow-add-1.c: Likewise. * c-c++-common/ubsan/overflow-mul-1.c: Likewise. * c-c++-common/ubsan/overflow-mul-3.c: Likewise. * c-c++-common/ubsan/overflow-negate-2.c: Likewise. * c-c++-common/ubsan/overflow-sub-1.c: Likewise. * c-c++-common/ubsan/pr59503.c: Likewise. * c-c++-common/ubsan/pr60613-1.c: Likewise. * c-c++-common/ubsan/save-expr-1.c: Likewise. * c-c++-common/ubsan/shift-3.c: Likewise. * c-c++-common/ubsan/shift-6.c: Likewise. * c-c++-common/ubsan/undefined-1.c: Likewise. * c-c++-common/ubsan/vla-2.c: Likewise. * c-c++-common/ubsan/vla-3.c: Likewise. * c-c++-common/ubsan/vla-4.c: Likewise. * g++.dg/ubsan/cxx11-shift-1.C: Likewise. * g++.dg/ubsan/return-2.C: Likewise. Marek diff --git gcc/testsuite/c-c++-common/ubsan/div-by-zero-4.c gcc/testsuite/c-c++-common/ubsan/div-by-zero-4.c index 295f624..02162e1 100644 --- gcc/testsuite/c-c++-common/ubsan/div-by-zero-4.c +++ gcc/testsuite/c-c++-common/ubsan/div-by-zero-4.c @@ -1,7 +1,7 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=integer-divide-by-zero -Wno-overflow" } */ -#include +#define INT_MIN (-__INT_MAX__ - 1) int main (void) diff --git gcc/testsuite/c-c++-common/ubsan/overflow-1.c gcc/testsuite/c-c++-common/ubsan/overflow-1.c index 8165463..6819955 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-1.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-1.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow" } */ +#include + #ifndef ASM1 # define ASM1(a) /* Nothing */ #endif @@ -51,6 +53,8 @@ int main (void) { + fputs ("UBSAN TEST START\n", stderr); + CHECK (FN1 (char, char, +), 23); CHECK (FN1 (char, char, -), 5); CHECK (FN1 (char, char, *), 126); @@ -258,5 +262,8 @@ main (void) CHECK (FN5 (long long int), -77); CHECK (FN5 (unsigned long long int), -77); + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/overflow-add-1.c gcc/testsuite/c-c++-common/ubsan/overflow-add-1.c index 3f4790b..fd6c6d3 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-add-1.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-add-1.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */ +#include + #define SCHAR_MAX __SCHAR_MAX__ #define SHRT_MAX __SHRT_MAX__ #define INT_MAX __INT_MAX__ @@ -16,6 +18,8 @@ check (int i, int j) int main (void) { + fputs ("UBSAN TEST START\n", stderr); + #if __INT_MAX__ == 2147483647 /* Here, nothing should fail. */ volatile int j = INT_MAX; @@ -56,5 +60,8 @@ main (void) check (d, -32768); #endif + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/overflow-mul-1.c gcc/testsuite/c-c++-common/ubsan/overflow-mul-1.c index bb355a2..afb1a25 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-mul-1.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-mul-1.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */ +#include + #define SCHAR_MAX __SCHAR_MAX__ #define SHRT_MAX __SHRT_MAX__ #define INT_MAX __INT_MAX__ @@ -16,6 +18,8 @@ check (int i, int j) int main (void) { + fputs ("UBSAN TEST START\n", stderr); + /* Test integer promotion. */ #if __SCHAR_MAX__ == 127 volatile signed char a = -2; @@ -42,5 +46,8 @@ main (void) check (o, INT_MIN); #endif + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/overflow-mul-3.c gcc/testsuite/c-c++-common/ubsan/overflow-mul-3.c index 49332dc..037609b 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-mul-3.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-mul-3.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow" } */ +#include + __attribute__((noinline, noclone)) long long mul (long long x, long long y) { @@ -29,10 +31,16 @@ long long tab[] = { int main () { + fputs ("UBSAN TEST START\n", stderr); + unsigned int i; for (i = 0; i < sizeof (tab) / sizeof (long long); i += 3) if (mul (tab[i], tab[i + 1]) != tab[i + 2] || mul (tab[i + 1], tab[i]) != tab[i + 2]) __builtin_abort (); + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/overflow-negate-2.c gcc/testsuite/c-c++-common/ubsan/overflow-negate-2.c index 9a711c2..6a4f288 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-negate-2.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-negate-2.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */ +#include + #define SCHAR_MIN (-__SCHAR_MAX__ - 1) #define SHRT_MIN (-__SHRT_MAX__ - 1) #define INT_MIN (-__INT_MAX__ - 1) @@ -12,6 +14,8 @@ int main (void) { + fputs ("UBSAN TEST START\n", stderr); + volatile signed char c = -SCHAR_MIN; CHECK (c, -128); @@ -34,5 +38,8 @@ main (void) lli = -(unsigned long long) lli; CHECK (lli, -0x8000000000000000L); + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/overflow-sub-1.c gcc/testsuite/c-c++-common/ubsan/overflow-sub-1.c index 2dcf16d..15f0445 100644 --- gcc/testsuite/c-c++-common/ubsan/overflow-sub-1.c +++ gcc/testsuite/c-c++-common/ubsan/overflow-sub-1.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */ +#include + #define SCHAR_MAX __SCHAR_MAX__ #define SCHAR_MIN (-__SCHAR_MAX__ - 1) #define SHRT_MAX __SHRT_MAX__ @@ -18,6 +20,8 @@ check (int i, int j) int main (void) { + fputs ("UBSAN TEST START\n", stderr); + #if __INT_MAX__ == 2147483647 /* Here, nothing should fail. */ volatile int i = -1; @@ -58,5 +62,8 @@ main (void) check (d, 32767); #endif + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/pr59503.c gcc/testsuite/c-c++-common/ubsan/pr59503.c index 12fb4c2..1637f01 100644 --- gcc/testsuite/c-c++-common/ubsan/pr59503.c +++ gcc/testsuite/c-c++-common/ubsan/pr59503.c @@ -1,13 +1,21 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=signed-integer-overflow" } */ +#include + int main (void) { + fputs ("UBSAN TEST START\n", stderr); + long long int a = 14; long int b = 9; asm volatile ("" : "+r" (a), "+r" (b)); if ((a - b) != 5) __builtin_abort (); + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/pr60613-1.c gcc/testsuite/c-c++-common/ubsan/pr60613-1.c index 2161e0b..6794532 100644 --- gcc/testsuite/c-c++-common/ubsan/pr60613-1.c +++ gcc/testsuite/c-c++-common/ubsan/pr60613-1.c @@ -2,6 +2,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=undefined" } */ +#include + long long y; __attribute__((noinline, noclone)) long long @@ -24,10 +26,16 @@ bar (long long x) int main () { + fputs ("UBSAN TEST START\n", stderr); + y = 1; if (foo (8 - 2040) != 8 - 1) __builtin_abort (); if (bar (1) != 8 - 1) __builtin_abort (); + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/save-expr-1.c gcc/testsuite/c-c++-common/ubsan/save-expr-1.c index 24532e8..19b1eb0 100644 --- gcc/testsuite/c-c++-common/ubsan/save-expr-1.c +++ gcc/testsuite/c-c++-common/ubsan/save-expr-1.c @@ -1,11 +1,19 @@ /* { dg-do compile } */ /* { dg-options "-fsanitize=shift -Wall -Werror -O" } */ +#include + static int x; int main (void) { + fputs ("UBSAN TEST START\n", stderr); + int o = 1; int y = x << o; + + fputs ("UBSAN TEST END\n", stderr); return y; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/shift-3.c gcc/testsuite/c-c++-common/ubsan/shift-3.c index c639d17..65ee5d8 100644 --- gcc/testsuite/c-c++-common/ubsan/shift-3.c +++ gcc/testsuite/c-c++-common/ubsan/shift-3.c @@ -1,11 +1,19 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=shift -w" } */ +#include + int main (void) { + fputs ("UBSAN TEST START\n", stderr); + unsigned int a = 1; a <<= 31; a <<= 1; + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/shift-6.c gcc/testsuite/c-c++-common/ubsan/shift-6.c index a0e2e20..d88a429 100644 --- gcc/testsuite/c-c++-common/ubsan/shift-6.c +++ gcc/testsuite/c-c++-common/ubsan/shift-6.c @@ -2,10 +2,14 @@ /* { dg-do run { target int32plus } } */ /* { dg-options "-fsanitize=shift -w" } */ +#include + int x = 7; int main (void) { + fputs ("UBSAN TEST START\n", stderr); + /* All of the following should pass. */ int A[128 >> 5] = {}; int B[128 << 5] = {}; @@ -26,5 +30,9 @@ main (void) case 128 >> (4 + 1): return 1; } + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/undefined-1.c gcc/testsuite/c-c++-common/ubsan/undefined-1.c index 2458fcb..d1b9ce7 100644 --- gcc/testsuite/c-c++-common/ubsan/undefined-1.c +++ gcc/testsuite/c-c++-common/ubsan/undefined-1.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=undefined" } */ +#include + int foo (int x, int y) { @@ -19,7 +21,13 @@ bar (int x, int y) int main (void) { + fputs ("UBSAN TEST START\n", stderr); + foo (3, 2); bar (12, 42); + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/vla-2.c gcc/testsuite/c-c++-common/ubsan/vla-2.c index c62ced9..a11e4e7 100644 --- gcc/testsuite/c-c++-common/ubsan/vla-2.c +++ gcc/testsuite/c-c++-common/ubsan/vla-2.c @@ -1,9 +1,13 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */ +#include + int main (void) { + fputs ("UBSAN TEST START\n", stderr); + const int t = 0; struct s { int x; @@ -11,5 +15,8 @@ main (void) int g[t]; }; + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/vla-3.c gcc/testsuite/c-c++-common/ubsan/vla-3.c index 5e10af0..7772857 100644 --- gcc/testsuite/c-c++-common/ubsan/vla-3.c +++ gcc/testsuite/c-c++-common/ubsan/vla-3.c @@ -1,6 +1,8 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=vla-bound" } */ +#include + /* Don't instrument the arrays here. */ int foo (int n, int a[]) @@ -11,6 +13,13 @@ foo (int n, int a[]) int main (void) { + fputs ("UBSAN TEST START\n", stderr); + int a[6] = { }; - return foo (3, a); + int ret = foo (3, a); + + fputs ("UBSAN TEST END\n", stderr); + return ret; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/c-c++-common/ubsan/vla-4.c gcc/testsuite/c-c++-common/ubsan/vla-4.c index 3f7dd1d..8a7bbac 100644 --- gcc/testsuite/c-c++-common/ubsan/vla-4.c +++ gcc/testsuite/c-c++-common/ubsan/vla-4.c @@ -1,13 +1,21 @@ /* { dg-do run } */ /* { dg-options "-fsanitize=vla-bound" } */ +#include + int main (void) { + fputs ("UBSAN TEST START\n", stderr); + int x = 1; /* Check that the size of an array is evaluated only once. */ int a[++x]; if (x != 2) __builtin_abort (); + + fputs ("UBSAN TEST END\n", stderr); return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C index 3e16892..f2b2cbd 100644 --- gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C +++ gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C @@ -1,9 +1,18 @@ /* { dg-do run { target c++11 } } */ /* { dg-options "-fsanitize=shift -w" } */ +#include + int main (void) { + fputs ("UBSAN TEST START\n", stderr); + int a = 1; a <<= 31; + + fputs ("UBSAN TEST END\n", stderr); + return 0; } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */ diff --git gcc/testsuite/g++.dg/ubsan/return-2.C gcc/testsuite/g++.dg/ubsan/return-2.C index c7380f03..546f178 100644 --- gcc/testsuite/g++.dg/ubsan/return-2.C +++ gcc/testsuite/g++.dg/ubsan/return-2.C @@ -1,6 +1,8 @@ // { dg-do run } // { dg-options "-fsanitize=return" } +#include + struct S { S (); ~S (); }; S::S () {} @@ -20,6 +22,12 @@ foo (int x) int main () { + fputs ("UBSAN TEST START\n", stderr); + foo (1); foo (14); + + fputs ("UBSAN TEST END\n", stderr); } + +/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */