【问题标题】:Realizing a goto statement [closed]实现 goto 语句[关闭]
【发布时间】:2012-12-21 09:46:24
【问题描述】:

实际上我正在尝试研究一个被 GOTO 语句混淆的代码 说..

private void fun()
{
if(somecondition)
    goto LABEL3;

...
...

LABEL3:
    return;
    Exception e;
    e;
    if(true) goto LABEL3; else LABEL7;


...
...

LABEL7:
    //some statements
}

在通过 IF 语句调用 LABEL3 时,
功能会停止吗? LABEL7会被调用吗?
程序将如何进行?

这是一个反编译的 java 类文件
反编译的类文件,其中一些语句被 goto 替换(例如,带有 goto 和 IF 组合的 WHILE),使它们难以阅读。

编辑

因为我认为反编译的类文件将完全不符合 java 语法,所以我发布了这个问题,但反编译器通常用于生成伪代码,但保留了很少的本机语法。是的,没有 goto,但它只是虚拟关键字,是的 LABEL3 可能会返回而其他人无法访问。

【问题讨论】:

  • 这是什么语言?问题标记为[java],但代码显然不是Java。
  • 只需调试它,您就会看到工作流程是什么。
  • 我在LABEL3 中看到无法访问的代码,无论您使用什么语言。
  • Java 有一个保留关键字 GOTO,但它没有被使用...请指定应该用哪种语言编写
  • 无论是什么语言,goto 标签都会跳转到那个标签。因为它后面包含'return',所以这里应该没有方法。

标签: java coding-style goto


【解决方案1】:

这段代码看起来像 jad 无法完全反编译 .class 时的输出

如果是这种情况,请检查错误(在类文件末尾的 java cmets 中)。它可能会与您发布的代码块有关。

【讨论】:

  • 是的,实际上他们没有生成java源代码而是伪代码..并且没有任何错误日志,什么都没有..
  • 您应该查看java文件末尾源代码中的cmets,在反编译时引用错误。它通常发生在静态块或静态声明中。
  • 我忘了提到它总是在反编译同步块时发生。
【解决方案2】:

如果条件if(somecondition) 成立,函数将退出。因此,LABEL7 将不会被调用。 return 应该表示“从函数返回”而不是从 goto 块返回。至少如果 Java(或其他语言,从评论看来不是 Java)没有改变 gotoreturn 的通常定义。

实际上,我想知道return; 之后的所有这些东西是干什么用的。它不应该被调用,因为在return(标签)之后没有其他入口点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多