analyzer: round-trip pointer-equality through intptr_t
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 5 Feb 2020 17:09:23 +0000 (12:09 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 6 Feb 2020 19:44:23 +0000 (14:44 -0500)
commitcb273d81a45092ceee793f0357526e291f03c7b7
treeec55943171813f6aee0f75f7a08d3a5a74ec5783
parent1ccdd460d1033f7e9158b1c6adfe208f315d1300
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.
gcc/analyzer/ChangeLog
gcc/analyzer/region-model.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/analyzer/torture/intptr_t.c [new file with mode: 0644]