Skip to content

Commit

Permalink
analyzer: avoid relying on system <assert.h> in testsuite (PR 93367)
Browse files Browse the repository at this point in the history
PR analyzer/93367 reports a testsuite failure in abort.c on
hppa64-hp-hpux11.11 when detecting if the analyzer "knows" that the
condition holds after the assert.

The root cause is that the assertion failure function in that
configuration's <assert.h> is not marked with
__attribute__ ((__noreturn__)).

This patch reworks the test to avoid <assert.h> in favor of a custom
implementation of assert, so that the test demonstrates the idea without
relying on properties of <assert.h>.

gcc/testsuite/ChangeLog:
	PR analyzer/93367
	* gcc.dg/analyzer/abort.c: Remove include of <assert.h>.
	Replace use of assert with a custom assertion implementation.
  • Loading branch information
davidmalcolm committed Jan 24, 2020
1 parent 472dc64 commit a0b935a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
6 changes: 6 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2020-01-23 David Malcolm <[email protected]>

PR analyzer/93367
* gcc.dg/analyzer/abort.c: Remove include of <assert.h>.
Replace use of assert with a custom assertion implementation.

2020-01-23 Jakub Jelinek <[email protected]>

PR inline-asm/93027
Expand Down
18 changes: 13 additions & 5 deletions gcc/testsuite/gcc.dg/analyzer/abort.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "analyzer-decls.h"
Expand Down Expand Up @@ -62,11 +61,20 @@ void test_4 (void *ptr)

/**************************************************************************/

/* Verify that we discover conditions from assertions if the assert macro
isn't disabled, and that it has its failure-handler labelled with
__attribute__ ((__noreturn__)).
This attribute isn't present for all implementations of <assert.h>, so
we have to test the idea using our own assert macro. */

extern void my_assert_fail (const char *expr, const char *file, int line)
__attribute__ ((__noreturn__));

#define MY_ASSERT(EXPR) \
do { if (!(EXPR)) my_assert_fail (#EXPR, __FILE__, __LINE__); } while (0)

void test_5 (int i)
{
assert (i < 10);

/* We have not defined NDEBUG, so this will call __assert_fail if
i >= 10, which is labelled with __attribute__ ((__noreturn__)). */
MY_ASSERT (i < 10);
__analyzer_eval (i < 10); /* { dg-warning "TRUE" } */
}

0 comments on commit a0b935a

Please sign in to comment.