https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104940
Bug ID: 104940 Summary: RFE: integrate analyzer with an SMT solver Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: analyzer Assignee: dmalcolm at gcc dot gnu.org Reporter: dmalcolm at gcc dot gnu.org Target Milestone: --- -fanalyzer currently has its own constraint_manager class for tracking the constraints that hold at a point on an execution path, but it only verifies some of the interactions between constraints and symbolic values, which can lead to false positives. For example, consider: #include "analyzer-decls.h" void test (int x, int y) { if (y == 3) if (2 * x == y) __analyzer_dump_path (); } The current constraint_manager code has no knowledge that (2 * x == y) is impossible for integers, and erroneously outputs: ../../src/gcc/testsuite/gcc.dg/analyzer/t.c: In function ‘test’: ../../src/gcc/testsuite/gcc.dg/analyzer/t.c:7:7: note: path 7 | __analyzer_dump_path (); | ^~~~~~~~~~~~~~~~~~~~~~~ ‘test’: events 1-5 | | 5 | if (y == 3) | | ^ | | | | | (1) following ‘true’ branch (when ‘y == 3’)... | 6 | if (2 * x == y) | | ~~~~~~ | | | | | | | (2) ...to here | | (3) following ‘true’ branch... | 7 | __analyzer_dump_path (); | | ~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) ...to here | | (5) here | Idea: get out of the business of tracking constraints by instead calling out to an SMT solver. I have a work-in-progress prototype of the analyzer which can call express constraints as an SMT-LIB2 script, and call out to an external z3 binary. Presumably we'd want an option to select between different constraint-tracking implementations, to avoid depending on z3 (or other smt solvers). Might be faster to link it in-process, but let's cross that bridge when we come to it. I'm filing this bug as a tracker bug for other constraint-tracking bugs.