【问题标题】:Set -noverify flag in java code在 java 代码中设置 -noverify 标志
【发布时间】:2017-04-22 12:31:09
【问题描述】:

我想通过 java 代码将 -noverify 设置为 VM 参数。我在网上找不到任何资源来帮助解决这个问题。

如果我使用 System.setProperty(..,..) ,我应该将什么设置为值或键?

我尝试过使用System.property("Xverify","none"),但这似乎不起作用。

注意:这只是为了运行一些测试用例。由于这个问题,我正在关闭字节码验证 - link

谢谢。

【问题讨论】:

  • 你为什么想要这个?
  • 使用 PowerMockito 时出现验证错误。这是它的解决方案,但我想把它放在代码中。
  • VerifyError 绝对意味着程序运行错误。在这种情况下关闭验证很危险,很可能导致 JVM 崩溃。永远不要相信抛出 VerifyError! 的应用程序或库
  • Here is an example 使用-noverify 运行时会发生什么(尽管库开发人员承诺此选项不会造成损害)。
  • 我知道这一点。这仅适用于测试用例。

标签: java jvm jvm-arguments


【解决方案1】:

让我在这个答案中总结一下 cmets。

  • 关闭字节码验证很危险,尤其是当您知道应用程序抛出VerifyError 时。这意味着应用程序生成了无效的字节码,当 JVM 执行它时,结果是不可预测的。例如,JVM 可能会像 this question 那样崩溃。
  • 没有合法的方式以编程方式关闭字节码验证。否则这将是一个严重的安全漏洞,允许在没有明确权限的情况下运行不安全的代码。
  • The link 您提到的 PowerMock 问题确认 Javassist 库中存在错误。解决此问题的正确方法是更新到已修复此错误的较新 Javassist 版本。

【讨论】:

    【解决方案2】:

    您需要使用“-Xverify:none”作为 vm 参数。 建议不要在生产环境中使用 -Xverify:none。

    对于那些不熟悉字节码验证的人来说,它只是 JVM 类加载过程的一部分,用于检查代码是否存在某些危险和不允许的行为。您可以(但不应该)通过添加 -Xverify:none 在许多 JVM 上禁用此保护

    请找到有关使用此标志的副作用的完整详细信息 - https://blogs.oracle.com/buck/entry/never_disable_bytecode_verification_in

    【讨论】:

    • 您建议如何在代码中将 Xverify 设置为 none?我尝试使用 System.setProperty 设置它,但它不起作用。
    猜你喜欢
    • 2019-04-10
    • 2013-08-22
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多