0

我正在研究自动化一个打印出 C 文件中所有常量的工具。到目前为止,我已经设法打印出 C 文件中的所有常量,但是如果不打印出整个抽象语法树,我想不出一种方法来显示它们关联的变量名,这有很多不必要的给我的信息。有没有人有任何想法?现在,它将打印出常量及其类型。这是我的代码:

from pycparser import c_parser, c_ast, parse_file

class ConstantVisitor(c_ast.NodeVisitor):
    def __init__(self):
        self.values = []
    def visit_Constant(self, node):
        self.values.append(node.value)
        node.show(showcoord=True,nodenames=True,attrnames=True)

def show_tree(filename):
# Note that cpp is used. Provide a path to your own cpp or
# make sure one exists in PATH.
    ast = parse_file(filename, use_cpp=True,cpp_args=['-E', r'-Iutils/fake_libc_include'])
    cv = ConstantVisitor()
    cv.visit(ast)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        filename  = sys.argv[1]
    else:
        filename = 'xmrig-master/src/crypto/c_blake256.c'

    show_tree(filename)

编辑:当前输出:常量:type=int,value=0x243456BE 期望输出:常量:type=int,name=变量名常量所属(通常是数组名),value=0x243456BE

4

1 回答 1

0

如果您想保留有关被访问节点的父节点的信息,您可能需要创建一个更复杂的访问者。有关示例,请参阅此常见问题解答。

也就是说,您还需要更清楚地定义您的目标。常量节点并不总是与变量相关联。例如:

  return a + 30 + 50;

有两个Constant节点(30个和50个);它们与什么变量相关联?

也许您正在寻找的是变量声明 -Decl具有名称的节点。然后一旦你找到一个Decl节点,在这个节点下再做一次访问,寻找所有的Constant节点。

于 2019-02-16T13:36:59.010 回答