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:
Lines 328 to 339 in 909249c
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... :(
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])
Here the modifications I made to make it work with IDA Pro 7.4:
Excellent! Please consider submitting a pull request!
Thanks @NeatMonster !
Fixes now integrated, thanks a lot @NeatMonster !