mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 23:34:52 +02:00
8122937: [JEP 245] Validate JVM Command-Line Flag Arguments
Validate the arguments to all JVM command-line flags so as to avoid crashes, and ensure that appropriate error messages are displayed when they are invalid. Reviewed-by: ddmitriev, dholmes, kbarrett, drwhite, brutisso, coleenp
This commit is contained in:
parent
ac072b303d
commit
ed2bb8c9fc
49 changed files with 2843 additions and 938 deletions
235
hotspot/src/share/vm/runtime/commandLineFlagConstraintsGC.cpp
Normal file
235
hotspot/src/share/vm/runtime/commandLineFlagConstraintsGC.cpp
Normal file
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "runtime/arguments.hpp"
|
||||
#include "runtime/commandLineFlagConstraintsGC.hpp"
|
||||
#include "runtime/globals.hpp"
|
||||
#include "utilities/defaultStream.hpp"
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
#include "gc/g1/g1_globals.hpp"
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
#ifdef COMPILER1
|
||||
#include "c1/c1_globals.hpp"
|
||||
#endif // COMPILER1
|
||||
#ifdef COMPILER2
|
||||
#include "opto/c2_globals.hpp"
|
||||
#endif // COMPILER2
|
||||
|
||||
Flag::Error MinHeapFreeRatioConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > MaxHeapFreeRatio)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
|
||||
"equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n",
|
||||
*value, MaxHeapFreeRatio);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error MaxHeapFreeRatioConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value < MinHeapFreeRatio)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"MaxHeapFreeRatio (" UINTX_FORMAT ") must be greater than or "
|
||||
"equal to MinHeapFreeRatio (" UINTX_FORMAT ")\n",
|
||||
*value, MinHeapFreeRatio);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error MinMetaspaceFreeRatioConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > MaxMetaspaceFreeRatio)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"MinMetaspaceFreeRatio (" UINTX_FORMAT ") must be less than or "
|
||||
"equal to MaxMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
|
||||
*value, MaxMetaspaceFreeRatio);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error MaxMetaspaceFreeRatioConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value < MinMetaspaceFreeRatio)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"MaxMetaspaceFreeRatio (" UINTX_FORMAT ") must be greater than or "
|
||||
"equal to MinMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
|
||||
*value, MinMetaspaceFreeRatio);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
// GC workaround for "-XX:+UseConcMarkSweepGC"
|
||||
// which sets InitialTenuringThreshold to 7 but leaves MaxTenuringThreshold remaining at 6
|
||||
// and therefore would invalidate the constraint
|
||||
#define UseConcMarkSweepGCWorkaroundIfNeeded(initial, max) { \
|
||||
if ((initial == 7) && (max == 6)) { \
|
||||
return Flag::SUCCESS; \
|
||||
} \
|
||||
}
|
||||
|
||||
Flag::Error InitialTenuringThresholdConstraintFunc(bool verbose, uintx* value) {
|
||||
UseConcMarkSweepGCWorkaroundIfNeeded(*value, MaxTenuringThreshold);
|
||||
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > MaxTenuringThreshold)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"InitialTenuringThreshold (" UINTX_FORMAT ") must be less than or "
|
||||
"equal to MaxTenuringThreshold (" UINTX_FORMAT ")\n",
|
||||
*value, MaxTenuringThreshold);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error MaxTenuringThresholdConstraintFunc(bool verbose, uintx* value) {
|
||||
UseConcMarkSweepGCWorkaroundIfNeeded(InitialTenuringThreshold, *value);
|
||||
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value < InitialTenuringThreshold)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"MaxTenuringThreshold (" UINTX_FORMAT ") must be greater than or "
|
||||
"equal to InitialTenuringThreshold (" UINTX_FORMAT ")\n",
|
||||
*value, InitialTenuringThreshold);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
Flag::Error G1NewSizePercentConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > G1MaxNewSizePercent)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"G1NewSizePercent (" UINTX_FORMAT ") must be less than or "
|
||||
"equal to G1MaxNewSizePercent (" UINTX_FORMAT ")\n",
|
||||
*value, G1MaxNewSizePercent);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error G1MaxNewSizePercentConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value < G1NewSizePercent)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"G1MaxNewSizePercent (" UINTX_FORMAT ") must be greater than or "
|
||||
"equal to G1NewSizePercent (" UINTX_FORMAT ")\n",
|
||||
*value, G1NewSizePercent);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
|
||||
Flag::Error CMSOldPLABMinConstraintFunc(bool verbose, size_t* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > CMSOldPLABMax)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"CMSOldPLABMin (" SIZE_FORMAT ") must be less than or "
|
||||
"equal to CMSOldPLABMax (" SIZE_FORMAT ")\n",
|
||||
*value, CMSOldPLABMax);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error CMSPrecleanDenominatorConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value <= CMSPrecleanNumerator)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"CMSPrecleanDenominator (" UINTX_FORMAT ") must be strickly greater than "
|
||||
"CMSPrecleanNumerator (" UINTX_FORMAT ")\n",
|
||||
*value, CMSPrecleanNumerator);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error CMSPrecleanNumeratorConstraintFunc(bool verbose, uintx* value) {
|
||||
if ((CommandLineFlags::finishedInitializing()) && (*value > (CMSPrecleanDenominator - 1))) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"CMSPrecleanNumerator (" UINTX_FORMAT ") must be less than or "
|
||||
"equal to CMSPrecleanDenominator - 1 (" UINTX_FORMAT ")\n", *value,
|
||||
CMSPrecleanDenominator - 1);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
} else {
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
Flag::Error SurvivorAlignmentInBytesConstraintFunc(bool verbose, intx* value) {
|
||||
if (CommandLineFlags::finishedInitializing()) {
|
||||
if (*value != 0) {
|
||||
if (!is_power_of_2(*value)) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"SurvivorAlignmentInBytes (" INTX_FORMAT ") must be power of 2\n",
|
||||
*value);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
if (*value < ObjectAlignmentInBytes) {
|
||||
if (verbose == true) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"SurvivorAlignmentInBytes (" INTX_FORMAT ") must be greater than or "
|
||||
"equal to ObjectAlignmentInBytes (" INTX_FORMAT ") \n",
|
||||
*value, ObjectAlignmentInBytes);
|
||||
}
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Flag::SUCCESS;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue