gpt4 book ai didi

c - 可视化 C 结构依赖项

转载 作者:行者123 更新时间:2023-12-04 11:50:35 26 4
gpt4 key购买 nike

在一个大型 C 项目中,有很多 struct s 有其他 struct s 或指向它们的指针,作为字段。我想创建一个有向图来显示“类型”之间的依赖关系。一个例子是

typedef struct javaStat {
int idNo;
struct idIdentList *className;
struct typeModifiers *thisType;
struct symbol thisClass;
} ...

由此我想生成一个 DOT 结构,它看起来像
digraph {
javaStat -> idIdentList
javaStat -> typeModifiers
javaStat -> symbol
}

或者,使用 DOT 简写:
digraph {
javaStat -> {idIdentList typeModifiers symbol}
}

当然,可以手动添加第一行和最后一行,因此主要问题是将结构引用转换为图形“指针”行。

在这一点上,我对第一级解决方案感到满意,这意味着可以忽略更深的嵌套。

我首先尝试了一个简单的 grep struct *.h这产生了一些可行的东西:
typedef struct javaStat {
struct idIdentList *className;
struct typeModifiers *thisType;
struct symbol thisClass;
typedef struct <next struct> {

这是一个简单的问题,几行 Python 就可以解决,但还有其他方便的解决方案,也许使用 sed , grep , awk和他们的兄弟?

编辑:我意识到我想要这样做的原因是因为我需要找到一个或多个位于“结构树”底部的结构。

最佳答案

Clang 9允许 c 的 AST 的 JSON 表示文件(在此 question 中找到)。可以进一步处理 JSON AST 以生成目标输出。

例如。此 Python脚本:

#clang_ast_to_dot.py
from jsonpath_rw_ext import parse;
import sys, json;

def extract_struct_name(fieldDefinition):
return fieldDefinition["type"]["qualType"].replace("struct", "").replace("*", "").replace(" ","")

def is_struct_field(fieldDefinition, knownStructs):
return (fieldDefinition["kind"] == "FieldDecl" and
("struct " in fieldDefinition["type"]["qualType"] or
extract_struct_name(fieldDefinition) in knownStructs))


data = json.load(sys.stdin)

allStructs = {}

for structDef in parse('$.inner[?(@.kind=="RecordDecl")]').find(data):
allStructs[structDef.value["name"]]=structDef.value

print("digraph {")
for name, structDescription in allStructs.items():
print(" %s -> {%s}"
% (name, ", ".join(extract_struct_name(field) for field in structDescription["inner"] if is_struct_field(field, allStructs))))
print("}")

称为:
clang -Xclang -ast-dump=json MyCFile.c | python clang_ast_to_dot.py

产生:
digraph {
javaStat -> {idIdentList, typeModifiers, symbol}
}

当然,这是一个玩具示例,我确定它不适用于所有情况。

关于c - 可视化 C 结构依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60640420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com