for (const auto &EQ : EQClasses) {
for (const BugReport &Report : EQ) {
- if (Report.getErrorNode()->getState() == N->getState())
+ if (Report.getErrorNode()->getState() == N->getState() &&
+ Report.getErrorNode()->getLocation() == N->getLocation())
return true;
}
}
return false;
}
- static std::string getNodeAttributes(const ExplodedNode *N,
- ExplodedGraph *) {
- SmallVector<StringRef, 10> Out;
- auto Noop = [](const ExplodedNode*){};
- if (traverseHiddenNodes(N, Noop, Noop, &nodeHasBugReport)) {
- Out.push_back("style=filled");
- Out.push_back("fillcolor=red");
- }
-
- if (traverseHiddenNodes(N, Noop, Noop,
- [](const ExplodedNode *C) { return C->isSink(); }))
- Out.push_back("color=blue");
- return llvm::join(Out, ",");
- }
-
static bool isNodeHidden(const ExplodedNode *N) {
return N->isTrivial();
}
const unsigned int Space = 1;
ProgramStateRef State = N->getState();
+ auto Noop = [](const ExplodedNode*){};
+ bool HasReport = traverseHiddenNodes(
+ N, Noop, Noop, &nodeHasBugReport);
+ bool IsSink = traverseHiddenNodes(
+ N, Noop, Noop, [](const ExplodedNode *N) { return N->isSink(); });
+
Out << "{ \"node_id\": " << N->getID(G) << ", \"pointer\": \""
<< (const void *)N << "\", \"state_id\": " << State->getID()
- << ", \"has_report\": " << (nodeHasBugReport(N) ? "true" : "false")
+ << ", \"has_report\": " << (HasReport ? "true" : "false")
+ << ", \"is_sink\": " << (IsSink ? "true" : "false")
<< ",\\l";
Indent(Out, Space, IsDot) << "\"program_points\": [\\l";
// CHECK: \"program_points\": [\l \{ \"kind\": \"BlockEntrance\", \"block_id\": 1
-// CHECK: \"has_report\": true
// CHECK: \"pretty\": \"*x\", \"location\": \{ \"line\": 18, \"column\": 10, \"file\": \"{{(.+)}}dump_egraph.c\" \}
// CHECK: \"pretty\": \"'\\\\x13'\"
+// CHECK: \"has_report\": true
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 4,
"pointer": "0x4",
+ "has_report": false,
+ "is_sink": false,
"state_id": 5,
"program_points": [],
"program_state": {
"{
{ "node_id": 6,
"pointer": "0x6",
+ "has_report": false,
+ "is_sink": false,
"state_id": 7,
"program_points": [],
"program_state": null
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 3,
"pointer": "0x3",
+ "has_report": false,
+ "is_sink": false,
"state_id": 4,
"program_points": [],
"program_state": {
"{
{ "node_id": 5,
"pointer": "0x5",
+ "has_report": false,
+ "is_sink": false,
"state_id": 6,
"program_points": [],
"program_state": {
// UNSUPPORTED: system-windows
Node0x1 [shape=record,label=
- "{{ "node_id": 1, "pointer": "0x1",
+ "{{ "node_id": 1, "pointer": "0x1", "has_report": false, "is_sink": false,
"program_state": null, "program_points": []}\l}"];
// LIGHT: Node0x1 -> Node0x2;
Node0x1 -> Node0x2;
Node0x2 [shape=record,label=
- "{{ "node_id": 2, "pointer": "0x2",
+ "{{ "node_id": 2, "pointer": "0x2", "has_report": false, "is_sink": false,
"program_state": null, "program_points": []}\l}"];
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 6,
"pointer": "0x6",
+ "has_report": false,
+ "is_sink": false,
"state_id": 7,
"program_points": [],
"program_state": {
"{
{ "node_id": 9,
"pointer": "0x9",
+ "has_report": false,
+ "is_sink": false,
"state_id": 7,
"program_points": [],
"program_state": {
// CHECK-SAME: </tr>
Node0x1 [shape=record,label=
"{
- { "node_id": 1, "pointer": "0x1",
+ { "node_id": 1, "pointer": "0x1", "has_report": false, "is_sink": false,
+ "program_state": null,
+ "program_points": []
+ }
+\l}"];
+
+// CHECK: Node0x2 [
+// CHECK-SAME: <tr><td>
+// CHECK-SAME: <font color="red"><b>Bug Report Attached</b></font>
+// CHECK-SAME: </td></tr>
+// CHECK-SAME: <tr><td>
+// CHECK-SAME: <font color="cornflowerblue"><b>Sink Node</b></font>
+// CHECK-SAME: </td></tr>
+Node0x2 [shape=record,label=
+ "{
+ { "node_id": 2, "pointer": "0x2", "has_report": true, "is_sink": true,
"program_state": null,
"program_points": []
}
// CHECK-SAME: </table>
Node0x1 [shape=record,label=
"{
- { "node_id": 1, "pointer": "0x1",
+ { "node_id": 1, "pointer": "0x1", "has_report": false, "is_sink": false,
"program_state": null, "program_points": [
{
"kind": "Edge",
// CHECK-SAME: </table>
Node0x2 [shape=record,label=
"{
- { "node_id": 2, "pointer": "0x2",
+ { "node_id": 2, "pointer": "0x2", "has_report": false, "is_sink": false,
"program_state": null, "program_points": [
{
"kind": "Statement",
// CHECK-SAME: <td>\{ ... \}</td>
Node0x3 [shape=record,label=
"{
- { "node_id": 3, "pointer": "0x3",
+ { "node_id": 3, "pointer": "0x3", "has_report": false, "is_sink": false,
"program_state": null, "program_points": [
{
"kind": "Statement",
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 1,
"pointer": "0x1",
+ "has_report": false,
+ "is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"{
{ "node_id": 4,
"pointer": "0x4",
+ "has_report": false,
+ "is_sink": false,
"state_id": 5,
"program_points": [],
"program_state": {
"{
{ "node_id": 6,
"pointer": "0x6",
+ "has_report": false,
+ "is_sink": false,
"state_id": 7,
"program_points": [],
"program_state": null
logging.debug('Adding ' + node_id)
self.node_id = json_node['node_id']
self.ptr = json_node['pointer']
+ self.has_report = json_node['has_report']
+ self.is_sink = json_node['is_sink']
self.points = [ProgramPoint(p) for p in json_node['program_points']]
self.state = ProgramState(json_node['state_id'],
json_node['program_state']) \
% ("gray20" if self._dark_mode else "gray",
node.node_id, node.ptr, node.state.state_id
if node.state is not None else 'Unspecified'))
+ if node.has_report:
+ self._dump('<tr><td><font color="red"><b>Bug Report Attached'
+ '</b></font></td></tr>')
+ if node.is_sink:
+ self._dump('<tr><td><font color="cornflowerblue"><b>Sink Node'
+ '</b></font></td></tr>')
self._dump('<tr><td align="left" width="0">')
if len(node.points) > 1:
self._dump('<b>Program points:</b></td></tr>')