I've just pushed this patch kit to trunk for GCC 17, as
r17-6239-g104f7f7d145d1d through r17-6246-g7647c00b77ee1a.
See the last patch (8/8) for a high-level description of the changes,
along with slides 42 onwards of my 2026 Cauldron talk.
Successfully regrtested on x86_64-pc-linux-gnu.
Successfully bootstrapped & regrtested on aarch64-unknown-linux-gnu.
Successful run of analyzer integration tests on
aarch64-unknown-linux-gnu.
I verified that the selftests pass on aarch64 with both -mbig-endian and
-mlittle-endian, and on arm-unknown-eabi and pdp11-dec-aout (to get
32-bit target coverage).
Lightly tested with valgrind.
This should be a significant improvement in the maintainability and
accuracy of the analyzer, but given the size of the patches:
191 files changed, 33916 insertions(+), 12328 deletions(-)
it's inevitable that I've broken *something*; sorry in advance.
Dave
David Malcolm (8):
diagnostics: add diagnostics::markup
analyzer: add integer class
analyzer: add unit-safe integer classes
analyzer: add concrete-ranges.h/cc
analyzer: rename symbol to symbolic::node
analyzer: add selftests and more member fns for struct complexity
analyzer: add node_manager
analyzer: rewrite of symbolic value handling
gcc/Makefile.in | 15 +-
gcc/analyzer/access-diagram.cc | 1218 ++---
gcc/analyzer/access-diagram.h | 89 +-
gcc/analyzer/ana-state-to-diagnostic-state.cc | 94 +-
gcc/analyzer/ana-state-to-diagnostic-state.h | 5 +-
gcc/analyzer/analyzer-logging.cc | 5 +
gcc/analyzer/analyzer-logging.h | 7 +
gcc/analyzer/analyzer-selftests.cc | 68 +-
gcc/analyzer/analyzer-selftests.h | 32 +-
gcc/analyzer/bounds-checking.cc | 972 ++--
gcc/analyzer/call-details.cc | 101 +-
gcc/analyzer/call-details.h | 14 +-
gcc/analyzer/call-string.cc | 29 +
gcc/analyzer/call-string.h | 9 +
gcc/analyzer/call-summary.cc | 676 ++-
gcc/analyzer/call-summary.h | 39 +-
gcc/analyzer/checker-event.cc | 3 +-
gcc/analyzer/common.h | 232 +-
gcc/analyzer/complexity.cc | 63 +-
gcc/analyzer/complexity.h | 31 +-
gcc/analyzer/concrete-ranges.cc | 770 +++
gcc/analyzer/concrete-ranges.h | 142 +
gcc/analyzer/constraint-manager.cc | 366 +-
gcc/analyzer/constraint-manager.h | 5 +-
gcc/analyzer/diagnostic-manager.cc | 60 +-
gcc/analyzer/engine.cc | 202 +-
gcc/analyzer/exploded-graph.h | 27 +-
gcc/analyzer/exploded-path.cc | 6 +-
gcc/analyzer/feasible-graph.cc | 4 +-
gcc/analyzer/infinite-recursion.cc | 116 +-
gcc/analyzer/initializers.cc | 287 ++
gcc/analyzer/integer-with-unit.cc | 580 +++
gcc/analyzer/integer-with-unit.h | 403 ++
gcc/analyzer/integer.cc | 493 ++
gcc/analyzer/integer.h | 297 ++
gcc/analyzer/kf-analyzer.cc | 49 +-
gcc/analyzer/kf-lang-cp.cc | 31 +-
gcc/analyzer/kf.cc | 182 +-
gcc/analyzer/liveness-context.h | 70 +
gcc/analyzer/ops.cc | 16 +-
gcc/analyzer/poisoned-value-diagnostic.cc | 35 +-
gcc/analyzer/program-point.cc | 34 +-
gcc/analyzer/program-point.h | 4 +
gcc/analyzer/program-state.cc | 785 ++--
gcc/analyzer/program-state.h | 40 +-
gcc/analyzer/ranges.cc | 328 --
gcc/analyzer/ranges.h | 100 -
gcc/analyzer/record-layout.cc | 30 +-
gcc/analyzer/record-layout.h | 25 +-
gcc/analyzer/region-model-asm.cc | 9 +-
gcc/analyzer/region-model-manager.cc | 1120 ++---
gcc/analyzer/region-model-manager.h | 96 +-
gcc/analyzer/region-model-reachability.cc | 195 +-
gcc/analyzer/region-model-reachability.h | 16 +-
gcc/analyzer/region-model.cc | 3560 +++++++-------
gcc/analyzer/region-model.h | 280 +-
gcc/analyzer/region.cc | 2013 ++++----
gcc/analyzer/region.h | 517 +-
gcc/analyzer/setjmp-longjmp.cc | 26 +-
gcc/analyzer/sm-fd.cc | 7 +-
gcc/analyzer/sm-file.cc | 18 +-
gcc/analyzer/sm-malloc.cc | 18 +-
gcc/analyzer/sm-signal.cc | 2 +-
gcc/analyzer/sm-taint.cc | 92 +-
gcc/analyzer/state-purge.cc | 19 +-
gcc/analyzer/store.cc | 3588 ++++----------
gcc/analyzer/store.h | 1068 ++---
gcc/analyzer/string-scan.cc | 751 +++
gcc/analyzer/string-scan.h | 143 +
gcc/analyzer/svalue.cc | 1838 +++-----
gcc/analyzer/svalue.h | 872 ++--
gcc/analyzer/symbol.h | 53 -
gcc/analyzer/symbolic-bit-contents.cc | 4186 +++++++++++++++++
gcc/analyzer/symbolic-bit-contents.h | 1165 +++++
gcc/analyzer/symbolic-bit-vectors.cc | 4074 ++++++++++++++++
gcc/analyzer/symbolic-bit-vectors.h | 1396 ++++++
gcc/analyzer/symbolic-memory-offsets.h | 96 +
gcc/analyzer/symbolic-memory-ranges.cc | 137 +
gcc/analyzer/symbolic-memory-ranges.h | 85 +
gcc/analyzer/symbolic-nodes.cc | 557 +++
gcc/analyzer/symbolic-nodes.h | 706 +++
gcc/analyzer/symbolic-pointers.cc | 324 ++
gcc/analyzer/symbolic-pointers.h | 100 +
gcc/analyzer/symbolic-ranges.cc | 373 ++
gcc/analyzer/symbolic-ranges.h | 190 +
gcc/analyzer/symbolic-scalars.cc | 2847 +++++++++++
gcc/analyzer/symbolic-scalars.h | 905 ++++
gcc/analyzer/{symbol.cc => type.h} | 34 +-
gcc/analyzer/units.h | 69 +
gcc/analyzer/varargs.cc | 242 +-
gcc/analyzer/write-to-const-diagnostics.cc | 28 +-
gcc/custom-sarif-properties/state-graphs.cc | 2 +-
gcc/custom-sarif-properties/state-graphs.h | 2 +-
gcc/diagnostics/color.cc | 9 +-
gcc/diagnostics/diagnostics-selftests.cc | 1 +
gcc/diagnostics/diagnostics-selftests.h | 1 +
gcc/diagnostics/markup.cc | 734 +++
gcc/diagnostics/markup.h | 596 +++
gcc/doc/analyzer.texi | 248 +-
gcc/selftest-run-tests.cc | 1 +
.../c-c++-common/analyzer/aliasing-6.c | 80 +
.../c-c++-common/analyzer/attr-const-3.c | 2 +-
.../analyzer/call-summaries-malloc.c | 10 +-
.../analyzer/call-summaries-pr107158-2.c | 4 +-
.../analyzer/call-summaries-pr107158.c | 4 +-
.../c-c++-common/analyzer/capacity-1.c | 2 +-
.../analyzer/compound-assignment-5.c | 2 +-
.../analyzer/deref-before-check-3.c | 56 +
.../c-c++-common/analyzer/double-free-2.c | 8 +
.../analyzer/flex-with-call-summaries.c | 3 +-
.../analyzer/flex-without-call-summaries.c | 6 +-
...nfinite-loop-doom-d_main-IdentifyVersion.c | 2 +-
.../c-c++-common/analyzer/large-constants.c | 37 +
.../analyzer/leak-multiple-returns.c | 20 +
.../leak-pr108045-with-call-summaries.c | 4 +-
.../c-c++-common/analyzer/leak-pr126831.c | 29 +
.../c-c++-common/analyzer/leak-pr126832.c | 34 +
.../loop-0-up-to-n-by-1-with-iter-obj.c | 1 +
gcc/testsuite/c-c++-common/analyzer/loop-2.c | 5 +-
gcc/testsuite/c-c++-common/analyzer/loop-2a.c | 5 +-
.../c-c++-common/analyzer/maybe-live-1.c | 47 +
.../c-c++-common/analyzer/maybe-live-2.c | 11 +
.../c-c++-common/analyzer/null-compare.c | 25 +
.../analyzer/null-terminated-strings-2.c | 6 +-
.../analyzer/out-of-bounds-bits.c | 66 +
.../analyzer/out-of-bounds-diagram-11.c | 72 +-
.../analyzer/out-of-bounds-diagram-3.c | 3 +-
.../analyzer/out-of-bounds-diagram-pr110928.c | 10 +-
.../analyzer/out-of-bounds-pr114472.c | 10 +
gcc/testsuite/c-c++-common/analyzer/paths-5.c | 2 +-
.../analyzer/pointer-comparison-pr125304-eq.c | 16 +-
.../analyzer/pointer-comparison-pr125304-ge.c | 9 +-
.../analyzer/pointer-comparison-pr125304-gt.c | 5 +-
.../analyzer/pointer-comparison-pr125304-le.c | 9 +-
.../analyzer/pointer-comparison-pr125304-lt.c | 5 +-
.../c-c++-common/analyzer/strlen-pr113999.c | 6 +-
.../c-c++-common/analyzer/strncpy-1.c | 12 +-
.../c-c++-common/analyzer/symbolic-1.c | 3 +-
.../c-c++-common/analyzer/symbolic-4.c | 2 +-
.../c-c++-common/analyzer/taint-inheritance.c | 68 +
.../analyzer/uintptr-cast-double-free.c | 65 +
.../c-c++-common/analyzer/use-after-free-4.c | 85 +
.../c-c++-common/analyzer/use-after-free-5.c | 64 +
...er-show-events-in-system-headers-default.C | 2 +-
...nalyzer-show-events-in-system-headers-no.C | 2 +-
.../analyzer/initializers-with-RANGE_EXPR.C | 20 +
.../analyzer/out-of-bounds-placement-new.C | 1 +
gcc/testsuite/g++.dg/analyzer/pr100244.C | 1 +
.../g++.dg/analyzer/std-unique_ptr-3.C | 17 +
.../torture/std-string-ctor-large-literal.C | 3 +-
.../torture/std-string-ctor-small-literal.C | 3 +-
.../gcc.dg/analyzer/analyzer-decls.h | 6 +
.../gcc.dg/analyzer/boxed-malloc-1.c | 6 +-
.../gcc.dg/analyzer/call-summaries-2.c | 33 +-
gcc/testsuite/gcc.dg/analyzer/data-model-1.c | 3 +-
.../analyzer/doom-d_main-IdentifyVersion.c | 46 +-
gcc/testsuite/gcc.dg/analyzer/ice-pr113496.c | 2 +-
.../gcc.dg/analyzer/leak-expressions-1.c | 185 +
.../gcc.dg/analyzer/leak-pr126832-macro.c | 63 +
gcc/testsuite/gcc.dg/analyzer/mkdtemp-1.c | 16 +-
.../gcc.dg/analyzer/null-deref-pr102671-1.c | 2 +-
.../analyzer/null-terminated-strings-1.c | 30 +-
.../analyzer/out-of-bounds-diagram-1-debug.c | 42 +-
.../analyzer/out-of-bounds-diagram-16.c | 2 +-
.../gcc.dg/analyzer/out-of-bounds-diagram-2.c | 28 +-
.../gcc.dg/analyzer/out-of-bounds-diagram-9.c | 33 +-
.../gcc.dg/analyzer/pattern-test-2.c | 2 +-
gcc/testsuite/gcc.dg/analyzer/pipe-1.c | 2 -
gcc/testsuite/gcc.dg/analyzer/pipe2-1.c | 2 -
gcc/testsuite/gcc.dg/analyzer/pr104417.c | 3 +-
.../gcc.dg/analyzer/pr104434-nonconst.c | 4 +-
.../gcc.dg/analyzer/pr93355-localealias.c | 2 +-
gcc/testsuite/gcc.dg/analyzer/pr93382.c | 2 +-
gcc/testsuite/gcc.dg/analyzer/single-field.c | 2 +-
.../gcc.dg/analyzer/state-diagram-2.c | 2 +-
.../gcc.dg/analyzer/state-diagram-5-sarif.py | 4 +-
.../gcc.dg/analyzer/stdarg-1-ms_abi.c | 6 +-
gcc/testsuite/gcc.dg/analyzer/stdarg-1.c | 6 +-
gcc/testsuite/gcc.dg/analyzer/stdarg-2.c | 6 +-
gcc/testsuite/gcc.dg/analyzer/strcpy-3.c | 1 -
gcc/testsuite/gcc.dg/analyzer/strlen-1.c | 35 +
.../gcc.dg/analyzer/taint-read-offset-1.c | 6 +-
.../gcc.dg/analyzer/torture/loop-inc-ptr-2.c | 2 +-
.../gcc.dg/analyzer/torture/pr59037.c | 4 +
gcc/testsuite/gcc.dg/analyzer/unknown-fns-5.c | 52 +
gcc/testsuite/gcc.dg/analyzer/unknown-fns-6.c | 20 +
gcc/testsuite/gcc.dg/analyzer/vla-1.c | 9 +-
.../gcc.dg/plugin/infoleak-CVE-2011-1078-1.c | 4 +
.../gcc.dg/plugin/infoleak-uninit-size-1.c | 2 +-
.../gcc.dg/plugin/infoleak-vfio_iommu_type1.c | 3 +-
.../plugin/taint-pr112850-too-complex.c | 4 +-
191 files changed, 33916 insertions(+), 12328 deletions(-)
create mode 100644 gcc/analyzer/concrete-ranges.cc
create mode 100644 gcc/analyzer/concrete-ranges.h
create mode 100644 gcc/analyzer/initializers.cc
create mode 100644 gcc/analyzer/integer-with-unit.cc
create mode 100644 gcc/analyzer/integer-with-unit.h
create mode 100644 gcc/analyzer/integer.cc
create mode 100644 gcc/analyzer/integer.h
create mode 100644 gcc/analyzer/liveness-context.h
delete mode 100644 gcc/analyzer/ranges.cc
delete mode 100644 gcc/analyzer/ranges.h
create mode 100644 gcc/analyzer/string-scan.cc
create mode 100644 gcc/analyzer/string-scan.h
delete mode 100644 gcc/analyzer/symbol.h
create mode 100644 gcc/analyzer/symbolic-bit-contents.cc
create mode 100644 gcc/analyzer/symbolic-bit-contents.h
create mode 100644 gcc/analyzer/symbolic-bit-vectors.cc
create mode 100644 gcc/analyzer/symbolic-bit-vectors.h
create mode 100644 gcc/analyzer/symbolic-memory-offsets.h
create mode 100644 gcc/analyzer/symbolic-memory-ranges.cc
create mode 100644 gcc/analyzer/symbolic-memory-ranges.h
create mode 100644 gcc/analyzer/symbolic-nodes.cc
create mode 100644 gcc/analyzer/symbolic-nodes.h
create mode 100644 gcc/analyzer/symbolic-pointers.cc
create mode 100644 gcc/analyzer/symbolic-pointers.h
create mode 100644 gcc/analyzer/symbolic-ranges.cc
create mode 100644 gcc/analyzer/symbolic-ranges.h
create mode 100644 gcc/analyzer/symbolic-scalars.cc
create mode 100644 gcc/analyzer/symbolic-scalars.h
rename gcc/analyzer/{symbol.cc => type.h} (60%)
create mode 100644 gcc/analyzer/units.h
create mode 100644 gcc/diagnostics/markup.cc
create mode 100644 gcc/diagnostics/markup.h
create mode 100644 gcc/testsuite/c-c++-common/analyzer/aliasing-6.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/deref-before-check-3.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/double-free-2.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/large-constants.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/leak-multiple-returns.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/leak-pr126831.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/leak-pr126832.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/maybe-live-1.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/maybe-live-2.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/null-compare.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/out-of-bounds-bits.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/taint-inheritance.c
create mode 100644
gcc/testsuite/c-c++-common/analyzer/uintptr-cast-double-free.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/use-after-free-4.c
create mode 100644 gcc/testsuite/c-c++-common/analyzer/use-after-free-5.c
create mode 100644 gcc/testsuite/g++.dg/analyzer/initializers-with-RANGE_EXPR.C
create mode 100644 gcc/testsuite/g++.dg/analyzer/std-unique_ptr-3.C
create mode 100644 gcc/testsuite/gcc.dg/analyzer/leak-expressions-1.c
create mode 100644 gcc/testsuite/gcc.dg/analyzer/leak-pr126832-macro.c
create mode 100644 gcc/testsuite/gcc.dg/analyzer/unknown-fns-5.c
create mode 100644 gcc/testsuite/gcc.dg/analyzer/unknown-fns-6.c
--
2.56.0