CFG反编译无关模式结构化:区域识别方法的困惑与问询
CFG区域识别核心问题汇总
- 循环区域节点收集不全:以论文中的R1循环区域为例,能轻松找到从尾块c3到头块c1的回边,但无法可靠收集循环包含的所有块(比如n1、n2会被遗漏)。
- 无环区域识别的边缘情况存疑:针对R2这类无环区域,我尝试通过检测有两个前驱(n5、n6)且均被同一节点(b1)支配的节点(n7),再从尾块回溯到头块收集节点,但不确定该方法是否覆盖所有边缘场景。
- 子循环区域无法区分:曾假设循环区域包含头块支配的所有节点,但这种方式会把子循环(如c1、n1组成的子循环)包含进整个R1区域,无法单独识别子循环。
- 自研循环构建算法存在遗漏:尝试编写了Python算法构建循环区域,但仍会遗漏n1这类节点,代码如下:
def build_cyclic_region(procedure: Procedure, header: BasicBlock, tail: BasicBlock): loop = Region(header) work_list = set() if header != tail: loop.blocks.add(tail) work_list.add(tail) # dfs_post_order(set(), procedure.cfg, header.address, lambda block_addr: analyzer.basic_blocks[block_addr].dominators[header.id] and loop.blocks.add(analyzer.basic_blocks[block_addr])) while len(work_list): block: BasicBlock = work_list.pop() for pred in block.predecessor: if pred not in loop.blocks: loop.blocks.add(pred) work_list.add(pred) for succ in block.successor: if succ not in loop.blocks and succ.dominators[loop.header.id]: loop.blocks.add(succ) work_list.add(succ) return loop
- LLVM区域定义与传统认知冲突:研究LLVM的区域识别实现时,发现其不符合“区域头块支配所有节点(包括出口节点)”的传统定义。LLVM算法按后序遍历支配树,为每个节点取后支配节点作为入口-出口对,通过isRegion方法验证。以n2为入口、n9为出口的情况为例,isRegion会返回true,这与我的理解不符,不清楚自己遗漏了什么。
- 支配树切片的通用性待确认:绘制目标CFG的支配树后,发现从根节点的后继切片似乎可对应区域,但不确定该方法是否具有通用性,需要澄清与解决方案。
内容的提问来源于stack exchange,提问作者Jorayen
相关产品推荐
相关产品推荐

