patois/HRDevHelper

TypeError: unhashable type: 'cinsn_t' in IDA 7.4

Closed this issue · 5 comments

Hello,

I tried to use your plugin in IDA 7.4 and I encountered the error TypeError: unhashable type: 'cinsn_t' at the line 338 of the code when pressing the shortcut to launch the plugin.

Here is the faulting function:

HRDevHelper/hrdevhelper.py

Lines 328 to 339 in 909249c

def add_node(self, i):
for k in self.reverse.keys():
if i.obj_id == k.obj_id:
ida_kernwin.warning("bad ctree - duplicate nodes! (i.ea=%x)" % i.ea)
return -1
n = self.cg.add_node()
if n <= len(self.cg.items):
self.cg.items.append(i)
self.cg.items[n] = i
self.reverse[i] = n
return n

As the issue is linked to cinsn_t, I looked for a change in hexrays.hpp and I suspect this is probably because they added the line DECLARE_TYPE_AS_MOVABLE(cinsn_t) between the 7.3 and 7.4.

Do you have any hints about that?

Thanks !

Thank you, I've been aware of this issue, just haven't had the time to look into/fix it yet... :(

@icecr4ck

Here the modifications I made to make it work with IDA Pro 7.4:

diff --git a/hrdevhelper.py b/hrdevhelper.py
index 274eafe..b03340d 100644
--- a/hrdevhelper.py
+++ b/hrdevhelper.py
@@ -278,7 +278,7 @@ class cfunc_graph_t(ida_graph.GraphViewer):
             node_label = self.get_node_label(n)
             hl, color = self.get_node_color(n)
             nid = self.AddNode(("%s" % node_label, color))
-            nodes[item] = nid
+            nodes[item.obj_id] = nid
             if hl:
                 widget = ida_kernwin.find_widget(self._title)
                 ida_graph.viewer_center_on(widget, nid)
@@ -290,7 +290,7 @@ class cfunc_graph_t(ida_graph.GraphViewer):
             for i in xrange(self.nsucc(n)):
                 t = self.succ(n, i)
                 # original code removed, edges may not have labels in IDA
-                self.AddEdge(nodes[item], nodes[self.items[t]])
+                self.AddEdge(nodes[item.obj_id], nodes[self.items[t].obj_id])

         return True

@@ -326,8 +326,8 @@ class graph_builder_t(ida_hexrays.ctree_parentee_t):
         self.reverse = {} # citem_t -> node#

     def add_node(self, i):
-        for k in self.reverse.keys():
-            if i.obj_id == k.obj_id:
+        for k_obj_id in self.reverse.keys():
+            if i.obj_id == k_obj_id:
                 ida_kernwin.warning("bad ctree - duplicate nodes! (i.ea=%x)" % i.ea)
                 return -1

@@ -335,7 +335,7 @@ class graph_builder_t(ida_hexrays.ctree_parentee_t):
         if n <= len(self.cg.items):
             self.cg.items.append(i)
         self.cg.items[n] = i
-        self.reverse[i] = n
+        self.reverse[i.obj_id] = n
         return n

     def process(self, i):
@@ -344,8 +344,8 @@ class graph_builder_t(ida_hexrays.ctree_parentee_t):
             return n
         if len(self.parents) > 1:
             lp = self.parents.back().obj_id
-            for k, v in self.reverse.items():
-                if k.obj_id == lp:
+            for k_obj_id, v in self.reverse.items():
+                if k_obj_id == lp:
                     p = v
                     break
             self.cg.add_edge(p, n)

And if you also need Python 3 compatibility:

diff --git a/hrdevhelper.py b/hrdevhelper.py
index b03340d..3d0c1ed 100644
--- a/hrdevhelper.py
+++ b/hrdevhelper.py
@@ -273,7 +273,7 @@ class cfunc_graph_t(ida_graph.GraphViewer):
         self.Clear()

         # nodes
-        for n in xrange(len(self.items)):
+        for n in range(len(self.items)):
             item = self.items[n]
             node_label = self.get_node_label(n)
             hl, color = self.get_node_color(n)
@@ -284,10 +284,10 @@ class cfunc_graph_t(ida_graph.GraphViewer):
                 ida_graph.viewer_center_on(widget, nid)

         # edges
-        for n in xrange(len(self.items)):
+        for n in range(len(self.items)):
             item = self.items[n]

-            for i in xrange(self.nsucc(n)):
+            for i in range(self.nsucc(n)):
                 t = self.succ(n, i)
                 # original code removed, edges may not have labels in IDA
                 self.AddEdge(nodes[item.obj_id], nodes[self.items[t].obj_id])

@icecr4ck

Here the modifications I made to make it work with IDA Pro 7.4:

Excellent! Please consider submitting a pull request!

Fixes now integrated, thanks a lot @NeatMonster !