{"record":{"id":"c4a5d47dd91b25cc","repo":"oracle/graal","slug":"crashatthrowsoome-and-crashatisfatal-cannot-both-b","errorCode":null,"errorMessage":"CrashAtThrowsOOME and CrashAtIsFatal cannot both be enabled","messagePattern":"CrashAtThrowsOOME and CrashAtIsFatal cannot both be enabled","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalOptionValues.java","lineNumber":153,"sourceCode":"            }\n            OptionsParser.parseOptions(compilerOptionSettings, compilerOptionValues, descriptors);\n            return compilerOptionValues;\n        }\n    }\n\n    private static String stripPrefix(String name, String prefix) {\n        String baseName = name.substring(prefix.length());\n        if (baseName.isEmpty()) {\n            throw new IllegalArgumentException(\"Option name must follow '\" + prefix + \"' prefix\");\n        }\n        return baseName;\n    }\n\n    private static OptionValues initializeOptions() {\n        EconomicMap<OptionKey<?>, Object> values = parseOptions();\n        OptionValues options = new OptionValues(values);\n        if (HotSpotGraalCompiler.Options.CrashAtThrowsOOME.getValue(options) && HotSpotGraalCompiler.Options.CrashAtIsFatal.getValue(options) != 0) {\n            throw new IllegalArgumentException(\"CrashAtThrowsOOME and CrashAtIsFatal cannot both be enabled\");\n        }\n        return options;\n    }\n\n    static void printProperties(OptionValues compilerOptions, PrintStream out) {\n        boolean all = HotSpotGraalCompilerFactory.Options.PrintPropertiesAll.getValue(compilerOptions);\n        compilerOptions.printHelp(OptionsParser.getOptionsLoader(), out, GRAAL_OPTION_PROPERTY_PREFIX, all);\n        LibGraalSupport libgraal = LibGraalSupport.INSTANCE;\n        if (all && libgraal != null) {\n            libgraal.printOptions(out, LIBGRAAL_VM_OPTION_PROPERTY_PREFIX);\n        }\n    }\n}\n","sourceCodeStart":135,"sourceCodeEnd":167,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalOptionValues.java#L135-L167","documentation":"initializeOptions rejects an option combination: CrashAtThrowsOOME=true together with CrashAtIsFatal != 0 is contradictory (one makes crashing methods throw OutOfMemoryError for testing, the other makes the crash fatal), so IllegalArgumentException is thrown at Graal option initialization before any compilation.","triggerScenarios":"Setting both -Dgraal.CrashAtThrowsOOME=true and -Dgraal.CrashAtIsFatal=<nonzero> (e.g. 1) on the command line or via per-method options; evaluated once when HotSpotGraalOptionValues.initializeOptions builds the OptionValues.","commonSituations":"Test/fuzzing harnesses accumulating crash-injection flags over time; copying a diagnostics recipe that combined both options; CI defaults left over from an experiment.","solutions":["Choose one crash behavior: keep CrashAtThrowsOOME=true and drop CrashAtIsFatal (leave it 0/unset), or the reverse","Audit generated command lines for stale crash-injection flags before enabling Graal"],"exampleFix":"# before\n-Dgraal.CrashAtThrowsOOME=true -Dgraal.CrashAtIsFatal=1\n\n# after\n-Dgraal.CrashAtThrowsOOME=true","handlingStrategy":"validation","validationCode":"boolean crashOptsConsistent(boolean throwsOome, int isFatal) { return !(throwsOome && isFatal != 0); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set at most one of CrashAtThrowsOOME / CrashAtIsFatal","Audit crash-injection flags in test harness defaults","Fail fast on known-conflicting option pairs in your launcher"],"tags":["graal-compiler","options","testing","startup"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}