# 6.控制流还原：新方法

## 通用方案的难题？

人类很难阅读并理解完全由jmp/goto跳转组合成的CFG结构图，因此还原出高层的控制流结构，能够极大的提升反编译结果的可读性。

按照通用的还原方法标准，反编译工具希望还原后剩余的goto语句越少越好；

但是由于通用结构化分析技术对不可规约图的分析，存在不和处理的问题。程序分析的研究者们提出了更多的分析思路。

## 新方法

可以移步到补充章节，在那里我讨论了和控制流还原相关的两篇很有意思的论文：

* “Dream: no-more-goto”：这篇论文提出了一种no-more-goto算法，从理论上证明了任何的CFG都能还原出不带goto的高层次控制流结构。
* “Sailr：no-need no-more-goto”：这个更有牛逼，驳斥了上面的no-more-goto算法，认为判断控制流还原算法应该和编译前的源码对比，并给出了更为先进的控制流还原理论。

### goto-less方案：

“Dream: no-more-goto”方案提出一种“到达状态”的转换方案，从理论上证明了任何的CFG图都能转换为不带有goto的结构化图。（参考补充章节中的no-more-goto论文）

### 精确的还原方案：

但是随着goto-less的算法分析，以及对于编译器的优化方案的研究，也有研究者提出：goto语句的数量和控制流还原的效果没有关系，控制流还原效果应该和编译前的源码相似度进行对比！

我觉得他说的很对，控制流还原的目标是提升可读性，更别说有些编译器优化是无法完美还原；

因此尽可能的还原出接近源码的反编译结果，因为源码的可读性是最佳的。

## 精进：对于控制流还原的进一步研究
