Commit cb273d81 by David Malcolm

analyzer: round-trip pointer-equality through intptr_t

When investigating how the analyzer handles malloc/free of Cray pointers
in gfortran I noticed that that analyzer was losing information on
pointers that were cast to an integer type, and then back to a pointer
type again.

The root cause is that region_model::maybe_cast_1 was only preserving
the region_svalue-ness of the result if both types were pointers,
instead returning an unknown_svalue for a pointer-to-int cast.

This patch updates the above code so that it attempts to use a
region_svalue if *either* type is a pointer

Doing so allows the analyzer to recognize that the same underlying
region is in use through various casts through integer types.

gcc/analyzer/ChangeLog:
	* region-model.cc (region_model::maybe_cast_1): Attempt to provide
	a region_svalue if either type is a pointer, rather than if both
	types are pointers.

gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/torture/intptr_t.c: New test.
parent 1ccdd460
2020-02-06 David Malcolm <dmalcolm@redhat.com>
* region-model.cc (region_model::maybe_cast_1): Attempt to provide
a region_svalue if either type is a pointer, rather than if both
types are pointers.
2020-02-05 David Malcolm <dmalcolm@redhat.com> 2020-02-05 David Malcolm <dmalcolm@redhat.com>
* engine.cc (exploded_node::dump_dot): Show merger enodes. * engine.cc (exploded_node::dump_dot): Show merger enodes.
......
...@@ -4977,7 +4977,7 @@ region_model::maybe_cast_1 (tree dst_type, svalue_id sid) ...@@ -4977,7 +4977,7 @@ region_model::maybe_cast_1 (tree dst_type, svalue_id sid)
return sid; return sid;
if (POINTER_TYPE_P (dst_type) if (POINTER_TYPE_P (dst_type)
&& POINTER_TYPE_P (src_type)) || POINTER_TYPE_P (src_type))
{ {
/* Pointer to region. */ /* Pointer to region. */
if (region_svalue *ptr_sval = sval->dyn_cast_region_svalue ()) if (region_svalue *ptr_sval = sval->dyn_cast_region_svalue ())
......
2020-02-06 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/analyzer/torture/intptr_t.c: New test.
2020-02-06 Segher Boessenkool <segher@kernel.crashing.org> 2020-02-06 Segher Boessenkool <segher@kernel.crashing.org>
* gcc.target/powerpc/pr93012.c: New. * gcc.target/powerpc/pr93012.c: New.
......
/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
#include <stdlib.h>
typedef __INTPTR_TYPE__ intptr_t;
typedef __UINTPTR_TYPE__ uintptr_t;
void test_1 (void)
{
intptr_t ip;
void *p = malloc (1024);
ip = (intptr_t)p;
free ((void *)ip);
} /* { dg-bogus "leak" } */
void test_2 (void)
{
uintptr_t uip;
void *p = malloc (1024);
uip = (uintptr_t)p;
free ((void *)uip);
} /* { dg-bogus "leak" } */
void test_3 (intptr_t ip)
{
free ((void *)ip); /* { dg-message "first 'free'" } */
free ((void *)ip); /* { dg-warning "double-'free'" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment