On Thu, 17 Sep 2026 22:45:17 GMT, David Holmes <[email protected]> wrote:
>> ### Summary >> >> When specifying `-XX:UnlockDiagnosticVMOptions` without the necessary +/-, >> the following error is produced: >> >> $ java -XX:UnlockDiagnosticVMOptions -m jdk.httpserver >> Error: VM option 'UnlockDiagnosticVMOptions' is diagnostic and must be >> enabled via -XX:+UnlockDiagnosticVMOptions. >> >> >> Similarly with `-XX:UnlockExperimentalVMOptions`: >> >> $ java -XX:UnlockExperimentalVMOptions -m jdk.httpserver >> Error: VM option 'UnlockExperimentalVMOptions' is experimental and must be >> enabled via -XX:+UnlockExperimentalVMOptions. >> >> >> This recursive complaint about using the unlocker to unlock the unlocker is >> misleading and probably confusing for users. >> >> ### Root cause >> The problem is that `UnlockDiagnosticVMOptions` is **itself** a >> _diagnostic_ option. And `UnlockExperimentalVMOptions` is **itself** an >> _experimental_ option. >> >> `Arguments::process_argument` calls `parse_argument` which notices >> `UnlockDiagnosticVMOptions`/`UnlockExperimentalVMOptions` is missing +/- so >> leaves the option **unset**. Since the unlocker option is unset, and the >> unlocker option is itself diagnostic/experiemental, the "must be enabled" >> error is thrown because it hasn't yet been unlocked. >> >> UnlockDiagnosticVMOptions defaults to true in debug, so the problem only >> manifests in release builds. >> UnlockExperimentalVMOptions always defaults to false, so the problem >> manifests in all builds. >> >> >> ### Solution >> The solution is to treat `UnlockDiagnosticVMOptions` and >> `UnlockExperimentalVMOptions` as always unlocked. The existing Hotspot code >> already essentially does this, but this PR formalizes it in >> `JVMFlag::is_unlocked()`. As an added benefit, this allows for some >> simplification in other places too where we check the status of flags. >> >> >> >> --------- >> - [x] I confirm that I make this contribution in accordance with the >> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). > > src/hotspot/share/prims/whitebox.cpp line 1364: > >> 1362: WB_ENTRY(jboolean, WB_IsLockedVMFlag(JNIEnv* env, jobject o, jstring >> name)) >> 1363: const JVMFlag* flag = getVMFlag(thread, env, name); >> 1364: return (flag != nullptr) && flag->is_unlocked(); > > Suggestion: > > return (flag != nullptr) && !flag->is_unlocked(); > > This code is wrong. BTW this WB function seems unused but there is a test for it: `./lib-test/jdk/test/whitebox/vm_flags/VmFlagTest.java` ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/32910#discussion_r4042080493
