日常经常接触到一些 c 语言带有 goto 的代码,想着有没有自动化的方式把它们换成不带 goto 的代码,查找了一些资料但是没有继续下去,这里把查找到的资料发一下
Automated GOTO removal algorithm 根据这个帖子以及里面提到的资料,任何带有 goto 的代码都可以转化成不带 goto 的代码,好像有一个叫"Taming Control Flow"的算法可以做到
也有相关的开源代码,但或多或少都有一些缺点
mbergin/controlflow 这个是支持移除 go 语言的 goto,运行 go test 可以进行测试,但是因为 go 语言里面不允许一个 if block 里面有 label 标签的,导致不能直接移植到 c 语言中去
rwbogl/gbg 支持 C 语言,可以运行,但是有缺点:不支持 Unconditional gotos,A conditional goto is if (cond) goto foo. Wrap unconditionals in if (true). Hopefully this will be a part of the implementation.
哪位计算机大神有空可以以此为基础研究研究,甚至还可以用来发论文
1
webdisk 2019-06-02 10:52:20 +08:00
有 goto 还是很容易看懂的, 都是些跳出循环, 错误处理.
如果刻意去掉这种 goto, 大概就看不懂代码了 |
2
Chowe 2019-06-02 11:26:02 +08:00 via iPhone
goto 这么好用为什么要去掉
|
3
freefcw 2019-06-02 11:30:24 +08:00
goto 不是问题,滥用 goto 才是问题
|
4
CSM 2019-06-02 11:41:47 +08:00 via Android
不如反过来,把循环判断什么的都给转成 goto (这个应该可以实现吧,毕竟它们最终也会变成 jmp 指令)还有点价值,比如交实验报告的代码防止雷同之类(狗头
|
5
leeyuzhe 2019-06-02 11:47:21 +08:00 via Android
goto 又不都是渣渣,没必要无脑移除吧
|
6
co3site 2019-06-02 13:00:24 +08:00 via Android
goto 本质上就是 jmp,用得好很高效的,没必要全盘移除
|
7
nealwx 2019-06-02 13:20:52 +08:00
没必要无脑移除吧,goto 在面对错误处理还是很有用的。
|