analyzer: fix qsort issue with array_region keys (PR 93352)
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 21 Jan 2020 17:42:36 +0000 (12:42 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 21 Jan 2020 23:58:31 +0000 (18:58 -0500)
commit4f01e5778689977c9569477947b8062d8d866667
treeab213e6c9fc028c38992299801ee2921bae87cc1
parentc77074d05691053ee7347d9e44ab89b3adb23fb1
analyzer: fix qsort issue with array_region keys (PR 93352)

PR analyzer/93352 reports a qsort failure
  "comparator not anti-symmetric: -2147483648, -2147483648)"
within the analyzer on code involving an array access of [0x7fffffff + 1].

The issue is that array_region (which uses int for keys into known
values in the array) uses subtraction to implement int_cmp for sorting
the keys, which isn't going to work for boundary values.

Potentially a wider type should be used, but for now this patch fixes
the ICE by using explicit comparisons rather than subtraction to
implement the qsort callback.

gcc/analyzer/ChangeLog:
PR analyzer/93352
* region-model.cc (int_cmp): Rename to...
(array_region::key_cmp): ...this, using key_t rather than int.
Rewrite in terms of comparisons rather than subtraction to
ensure qsort is anti-symmetric when handling extreme values.
(array_region::walk_for_canonicalization): Update for above
renaming.
* region-model.h (array_region::key_cmp): New decl.

gcc/testsuite/ChangeLog:
PR analyzer/93352
* gcc.dg/analyzer/pr93352.c: New test.
gcc/analyzer/ChangeLog
gcc/analyzer/region-model.cc
gcc/analyzer/region-model.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/analyzer/pr93352.c [new file with mode: 0644]