From 64c79bf9e1e5ceaf4dadd24698f72aae11e51dc8 Mon Sep 17 00:00:00 2001 From: Jonas Jensen Date: Fri, 27 Dec 2019 11:21:33 +0100 Subject: [PATCH] C++: Deprecate UninitializedNode in IR data flow It's not used outside of tests, and it's not useful. It will break the tests when we start allowing flow through chi nodes. --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 18 ++++++++++++------ .../dataflow/dataflow-tests/test_diff.expected | 3 +++ .../dataflow/dataflow-tests/test_ir.expected | 3 --- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 959b3da419b..32cdc7ddfcb 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -59,10 +59,12 @@ class Node extends TIRDataFlowNode { Parameter asParameter() { result = instr.(InitializeParameterInstruction).getParameter() } /** + * DEPRECATED: See UninitializedNode. + * * Gets the uninitialized local variable corresponding to this node, if * any. */ - LocalVariable asUninitialized() { result = instr.(UninitializedInstruction).getLocalVariable() } + LocalVariable asUninitialized() { none() } /** * Gets an upper bound on the type of this node. @@ -140,15 +142,19 @@ private class ThisParameterNode extends Node { } /** + * DEPRECATED: Data flow was never an accurate way to determine what + * expressions might be uninitialized. It errs on the side of saying that + * everything is uninitialized, and this is even worse in the IR because the IR + * doesn't use syntactic hints to rule out variables that are definitely + * initialized. + * * The value of an uninitialized local variable, viewed as a node in a data * flow graph. */ -class UninitializedNode extends Node { - override UninitializedInstruction instr; +deprecated class UninitializedNode extends Node { + UninitializedNode() { none() } - LocalVariable getLocalVariable() { result = instr.getLocalVariable() } - - override string toString() { result = this.getLocalVariable().toString() } + LocalVariable getLocalVariable() { none() } } /** diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected index d0961962f29..7a2728229c6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected @@ -29,6 +29,9 @@ | ref.cpp:109:15:109:20 | ref.cpp:132:13:132:15 | AST only | | ref.cpp:122:23:122:28 | ref.cpp:123:13:123:15 | AST only | | ref.cpp:125:19:125:24 | ref.cpp:126:13:126:15 | AST only | +| test.cpp:75:7:75:8 | test.cpp:76:8:76:9 | AST only | +| test.cpp:83:7:83:8 | test.cpp:84:8:84:18 | AST only | +| test.cpp:83:7:83:8 | test.cpp:86:8:86:9 | AST only | | test.cpp:89:28:89:34 | test.cpp:92:8:92:14 | IR only | | test.cpp:100:13:100:18 | test.cpp:103:10:103:12 | AST only | | test.cpp:109:9:109:14 | test.cpp:110:10:110:12 | IR only | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected index d956ef872e3..9de0724ec38 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected @@ -31,9 +31,6 @@ | test.cpp:31:8:31:8 | c | test.cpp:36:13:36:18 | call to source | | test.cpp:58:10:58:10 | t | test.cpp:50:14:50:19 | call to source | | test.cpp:71:8:71:9 | x4 | test.cpp:66:30:66:36 | source1 | -| test.cpp:76:8:76:9 | u1 | test.cpp:75:7:75:8 | u1 | -| test.cpp:84:8:84:18 | ... ? ... : ... | test.cpp:83:7:83:8 | u2 | -| test.cpp:86:8:86:9 | i1 | test.cpp:83:7:83:8 | u2 | | test.cpp:90:8:90:14 | source1 | test.cpp:89:28:89:34 | source1 | | test.cpp:92:8:92:14 | source1 | test.cpp:89:28:89:34 | source1 | | test.cpp:110:10:110:12 | (reference dereference) | test.cpp:109:9:109:14 | call to source |