Revision2: Corrected: RFR 8059557 (XL): Validate JVM Command-Line Flag Arguments

Gerard Ziemski gerard.ziemski at oracle.com
Wed May 27 21:28:32 UTC 2015


hi all,

Here is a revision 2 of the feature taking into account feedback from 
Dmitry, David, Kim and Alexander.

One significant change in this rev is the addition of 
runtime/commandLineFlagConstraintsCompiler.hpp/.cpp with one simple 
constraint needed by Dmitry's test framework.

We introduce a new mechanism that allows specification of a valid range 
per flag that is then used to automatically validate given flag's value 
every time it changes. Ranges values must be constant and can not 
change. Optionally, a constraint can also be specified and applied every 
time a flag value changes for those flags whose valid value can not be 
trivially checked by a simple min and max (ex. whether it's power of 2, 
or bigger or smaller than some other flag that can also change)

I have chosen to modify the table macros (ex. RUNTIME_FLAGS in 
globals.hpp) instead of using a more sophisticated solution, such as C++ 
templates, because even though macros were unfriendly when initially 
developing, once a solution was arrived at, subsequent additions to the 
tables of new ranges, or constraint are trivial from developer's point 
of view. (The intial development unfriendliness of macros was mitigated 
by using a pre-processor, which for those using a modern IDE like Xcode, 
is easily available from a menu). Using macros also allowed for more 
minimal code changes.

The presented solution is based on expansion of macros using variadic 
functions and can be readily seen in 
runtime/commandLineFlagConstraintList.cpp and 
runtime/commandLineFlagRangeList.cpp

In commandLineFlagConstraintList.cpp or commandLineFlagRangesList.cpp, 
there is bunch of classes and methods that seems to beg for C++ template 
to be used. I have tried, but when the compiler tries to generate code 
for both uintx and size_t, which happen to have the same underlying type 
(on BSD), it fails to compile overridden methods with same type, but 
different name. If someone has a way of simplifying the new code via C++ 
templates, however, we can file a new enhancement request to address that.

This webrev represents only the initial range checking framework and 
only 100 or so flags that were ported from an existing ad hoc range 
checking code to this new mechanism. There are about 250 remaining flags 
that still need their ranges determined and ported over to this new 
mechansim and they are tracked by individual subtasks.

I had to modify several existing tests to change the error message that 
they expected when VM refuses to run, which was changed to provide 
uniform error messages.

To help with testing and subtask efforts I have introduced a new runtime 
flag:

   PrintFlagsRanges: "Print VM flags and their ranges and exit VM"

which in addition to the already existing flags: "PrintFlagsInitial" and 
"PrintFlagsFinal" allow for thorough examination of the flags values and 
their ranges.

The code change builds and passes JPRT (-testset hotspot) and UTE 
(vm.quick.testlist)


References:

           Webrev: http://cr.openjdk.java.net/~gziemski/8059557_rev2
             note: due to "awk" limit of 50 pats the Frames diff is not 
available for "src/share/vm/runtime/arguments.cpp"

              JEP:https://bugs.openjdk.java.net/browse/JDK-8059557
Compiler subtask:https://bugs.openjdk.java.net/browse/JDK-8078554
       GC subtask:https://bugs.openjdk.java.net/browse/JDK-8078555
  Runtime subtask:https://bugs.openjdk.java.net/browse/JDK-8078556


hgstat:

  src/cpu/ppc/vm/globals_ppc.hpp                              |    2 +-
  src/cpu/sparc/vm/globals_sparc.hpp                          |    2 +-
  src/cpu/x86/vm/globals_x86.hpp                              |    2 +-
  src/cpu/zero/vm/globals_zero.hpp                            |    3 +-
  src/os/aix/vm/globals_aix.hpp                               |    2 +-
  src/os/bsd/vm/globals_bsd.hpp                               |   29 +-
  src/os/linux/vm/globals_linux.hpp                           |    9 +-
  src/os/solaris/vm/globals_solaris.hpp                       |    4 +-
  src/os/windows/vm/globals_windows.hpp                       |    5 +-
  src/share/vm/c1/c1_globals.cpp                              |    4 +-
  src/share/vm/c1/c1_globals.hpp                              |   17 +-
  src/share/vm/gc_implementation/g1/g1_globals.cpp            |   16 +-
  src/share/vm/gc_implementation/g1/g1_globals.hpp            |   38 +-
  src/share/vm/opto/c2_globals.cpp                            |   12 +-
  src/share/vm/opto/c2_globals.hpp                            |   40 +-
  src/share/vm/prims/whitebox.cpp                             |   12 +-
  src/share/vm/runtime/arguments.cpp                          |  753 ++++++++++++++----------------------
  src/share/vm/runtime/arguments.hpp                          |   24 +-
  src/share/vm/runtime/commandLineFlagConstraintList.cpp      |  243 +++++++++++
  src/share/vm/runtime/commandLineFlagConstraintList.hpp      |   73 +++
  src/share/vm/runtime/commandLineFlagConstraintsCompiler.cpp |   46 ++
  src/share/vm/runtime/commandLineFlagConstraintsCompiler.hpp |   39 +
  src/share/vm/runtime/commandLineFlagConstraintsGC.cpp       |  251 ++++++++++++
  src/share/vm/runtime/commandLineFlagConstraintsGC.hpp       |   59 ++
  src/share/vm/runtime/commandLineFlagConstraintsRuntime.cpp  |   67 +++
  src/share/vm/runtime/commandLineFlagConstraintsRuntime.hpp  |   41 ++
  src/share/vm/runtime/commandLineFlagRangeList.cpp           |  304 ++++++++++++++
  src/share/vm/runtime/commandLineFlagRangeList.hpp           |   67 +++
  src/share/vm/runtime/globals.cpp                            |  699 +++++++++++++++++++++++++++------
  src/share/vm/runtime/globals.hpp                            |  310 ++++++++++++--
  src/share/vm/runtime/globals_extension.hpp                  |  101 +++-
  src/share/vm/runtime/init.cpp                               |    6 +-
  src/share/vm/runtime/os.hpp                                 |   17 +
  src/share/vm/runtime/os_ext.hpp                             |    7 +-
  src/share/vm/runtime/thread.cpp                             |    6 +
  src/share/vm/services/attachListener.cpp                    |    4 +-
  src/share/vm/services/classLoadingService.cpp               |    6 +-
  src/share/vm/services/diagnosticCommand.cpp                 |    3 +-
  src/share/vm/services/management.cpp                        |    6 +-
  src/share/vm/services/memoryService.cpp                     |    2 +-
  src/share/vm/services/writeableFlags.cpp                    |  161 +++++--
  src/share/vm/services/writeableFlags.hpp                    |   52 +-
  test/compiler/c2/7200264/Test7200264.sh                     |    5 +-
  test/compiler/startup/NumCompilerThreadsCheck.java          |    2 +-
  test/gc/arguments/TestHeapFreeRatio.java                    |   23 +-
  test/gc/arguments/TestSurvivorAlignmentInBytesOption.java   |    6 +-
  test/gc/g1/TestStringDeduplicationTools.java                |    6 +-
  test/runtime/CompressedOops/CompressedClassSpaceSize.java   |    4 +-
  test/runtime/CompressedOops/ObjectAlignment.java            |    9 +-
  test/runtime/contended/Options.java                         |   10 +-
  50 files changed, 2730 insertions(+), 879 deletions(-)



More information about the hotspot-dev mailing list