diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-10-17 23:10:05 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-10-17 23:10:05 +0000 |
commit | d325196f19bfecff59252f3d214278fb6ee4ad61 (patch) | |
tree | 3e4d1cf85aed53aef2a637b9b3b0649892e15888 | |
parent | 73b67f0b1a3ca835a4c0481abee87a96a2107b7d (diff) | |
download | bcm5719-llvm-d325196f19bfecff59252f3d214278fb6ee4ad61.tar.gz bcm5719-llvm-d325196f19bfecff59252f3d214278fb6ee4ad61.zip |
[analyzer] Display cast kinds in program point dumps.
Because cast expressions have their own hierarchy, it's extremely useful
to have some information about what kind of casts are we dealing with.
llvm-svn: 375185
-rw-r--r-- | clang/lib/Analysis/ProgramPoint.cpp | 6 | ||||
-rw-r--r-- | clang/test/Analysis/exploded-graph-rewriter/program_points.dot | 48 | ||||
-rwxr-xr-x | clang/utils/analyzer/exploded-graph-rewriter.py | 6 |
3 files changed, 58 insertions, 2 deletions
diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp index 97e90965d00..0783fbed531 100644 --- a/clang/lib/Analysis/ProgramPoint.cpp +++ b/clang/lib/Analysis/ProgramPoint.cpp @@ -188,7 +188,11 @@ void ProgramPoint::printJson(llvm::raw_ostream &Out, const char *NL) const { Out << "Statement\", \"stmt_kind\": \"" << S->getStmtClassName() << "\", \"stmt_id\": " << S->getID(Context) - << ", \"pointer\": \"" << (const void *)S << "\", \"pretty\": "; + << ", \"pointer\": \"" << (const void *)S << "\", "; + if (const auto *CS = dyn_cast<CastExpr>(S)) + Out << "\"cast_kind\": \"" << CS->getCastKindName() << "\", "; + + Out << "\"pretty\": "; S->printJson(Out, nullptr, PP, AddQuotes); diff --git a/clang/test/Analysis/exploded-graph-rewriter/program_points.dot b/clang/test/Analysis/exploded-graph-rewriter/program_points.dot index 2f49d7f75ef..c27c230ebfb 100644 --- a/clang/test/Analysis/exploded-graph-rewriter/program_points.dot +++ b/clang/test/Analysis/exploded-graph-rewriter/program_points.dot @@ -116,3 +116,51 @@ Node0x3 [shape=record,label= } ]} \l}"]; + +// CHECK-NEXT: <b>Program point:</b> +// CHECK-SAME: <table border="0" align="left" width="0"> +// CHECK-SAME: <tr> +// CHECK-SAME: <td align="left" width="0"> +// CHECK-SAME: main.cpp:<b>8</b>:<b>9</b>: +// CHECK-SAME: </td> +// CHECK-SAME: <td align="left" width="0"> +// CHECK-SAME: <font color="cyan4"> +// CHECK-SAME: ImplicitCastExpr (LValueToRValue) +// CHECK-SAME: </font> +// CHECK-SAME: </td> +// CHECK-SAME: <td align="left"><i>S5</i></td> +// CHECK-SAME: <td align="left"> +// CHECK-SAME: <font color="cyan3">PreStmt</font> +// CHECK-SAME: </td> +// CHECK-SAME: <td align="left">y</td> +// CHECK-SAME: </tr> +// CHECK-SAME: <tr> +// CHECK-SAME: <td width="0"> +// CHECK-SAME: </td> +// CHECK-SAME: <td colspan="3" align="left"> +// CHECK-SAME: <b>Tag: </b> +// CHECK-SAME: <font color="crimson">ExprEngine : Clean Node</font> +// CHECK-SAME: </td> +// CHECK-SAME: </tr> +// CHECK-SAME: </table> +Node0x4 [shape=record,label= + "{ + { "node_id": 4, "pointer": "0x4", "has_report": false, "is_sink": false, + "program_state": null, "program_points": [ + { + "kind": "Statement", + "stmt_kind": "ImplicitCastExpr", + "cast_kind": "LValueToRValue", + "stmt_point_kind": "PreStmt", + "stmt_id": 5, + "pointer": "0x6", + "pretty": "y", + "location": { + "file": "main.cpp", + "line": 8, + "column": 9 + }, + "tag": "ExprEngine : Clean Node" + } + ]} +\l}"]; diff --git a/clang/utils/analyzer/exploded-graph-rewriter.py b/clang/utils/analyzer/exploded-graph-rewriter.py index 05b01b3f950..77da7392e36 100755 --- a/clang/utils/analyzer/exploded-graph-rewriter.py +++ b/clang/utils/analyzer/exploded-graph-rewriter.py @@ -73,6 +73,8 @@ class ProgramPoint(object): elif self.kind == 'Statement': logging.debug(json_pp) self.stmt_kind = json_pp['stmt_kind'] + self.cast_kind = json_pp['cast_kind'] \ + if 'cast_kind' in json_pp else None self.stmt_point_kind = json_pp['stmt_point_kind'] self.stmt_id = json_pp['stmt_id'] self.pointer = json_pp['pointer'] @@ -497,7 +499,9 @@ class DotDumpVisitor(object): '<td align="left"><i>S%s</i></td>' '<td align="left"><font color="%s">%s</font></td>' '<td align="left">%s</td></tr>' - % (self._make_sloc(p.loc), color, p.stmt_kind, + % (self._make_sloc(p.loc), color, + '%s (%s)' % (p.stmt_kind, p.cast_kind) + if p.cast_kind is not None else p.stmt_kind, p.stmt_id, stmt_color, p.stmt_point_kind, self._short_pretty(p.pretty) if not skip_pretty else '')) |