Request for Comments: Potential leak of memory pointed to by 'name' about jvmciCodeInstaller

Leslie Zhai zhaixiang at loongson.cn
Sun Mar 17 09:30:39 UTC 2019


Hi,

Bug reported[1] by the clang static analyzer.

Description: Potential leak of memory pointed to by 'name'
File: /home/zhaixiang/jdk/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp
Line: 653

652  char* name = strdup(java_lang_String::as_utf8_string(stubName));

      5 ← Memory is allocated  →

653  cb = RuntimeStub::new_runtime_stub(name,

      6 ← Potential leak of memory pointed to by 'name'

I checked `install` function in 
src/hotspot/share/jvmci/jvmciCodeInstaller.cpp and `installCode` 
C2V_VMENTRY in src/hotspot/share/jvmci/jvmciCompilerToVM.cpp carefully.  
There is no `free` to release the allocated memory, so I argue that it 
is a Memory leak issue, not a False positive[2]. May I file a bug if it 
is real potential leak of memory issue?

Because I think webrev is related to BUGID[3], so I just paste my patch 
here:


----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---
diff -r 1a18b8d56d73 src/hotspot/share/jvmci/jvmciCodeInstaller.cpp
--- a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp    Sat Mar 16 15:05:21 2019 -0700
+++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp    Sun Mar 17 17:06:50 2019 +0800
@@ -623,7 +623,7 @@
  #endif // INCLUDE_AOT
  
  // constructor used to create a method
-JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS) {
+JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, char*& cb_name, Handle installed_code, Handle speculation_log, TRAPS) {
    CodeBuffer buffer("JVMCI Compiler CodeBuffer");
    jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
    OopRecorder* recorder = new OopRecorder(&_arena, true);
@@ -649,8 +649,8 @@
      if (stubName == NULL) {
        JVMCI_ERROR_OK("stub should have a name");
      }
-    char* name = strdup(java_lang_String::as_utf8_string(stubName));
-    cb = RuntimeStub::new_runtime_stub(name,
+    cb_name = strdup(java_lang_String::as_utf8_string(stubName));
+    cb = RuntimeStub::new_runtime_stub(cb_name,
                                         &buffer,
                                         CodeOffsets::frame_never_safe,
                                         stack_slots,
diff -r 1a18b8d56d73 src/hotspot/share/jvmci/jvmciCodeInstaller.hpp
--- a/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp    Sat Mar 16 15:05:21 2019 -0700
+++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp    Sun Mar 17 17:06:50 2019 +0800
@@ -207,7 +207,7 @@
  #if INCLUDE_AOT
    JVMCIEnv::CodeInstallResult gather_metadata(Handle target, Handle compiled_code, CodeMetadata& metadata, TRAPS);
  #endif
-  JVMCIEnv::CodeInstallResult install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS);
+  JVMCIEnv::CodeInstallResult install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, char*& cb_name, Handle installed_code, Handle speculation_log, TRAPS);
  
    static address runtime_call_target_address(oop runtime_call);
    static VMReg get_hotspot_reg(jint jvmciRegisterNumber, TRAPS);
diff -r 1a18b8d56d73 src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
--- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp     Sat Mar 16 15:05:21 2019 -0700
+++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp     Sun Mar 17 17:06:50 2019 +0800
@@ -677,6 +677,7 @@
    Handle target_handle(THREAD, JNIHandles::resolve(target));
    Handle compiled_code_handle(THREAD, JNIHandles::resolve(compiled_code));
    CodeBlob* cb = NULL;
+  char* cb_name = NULL;
    Handle installed_code_handle(THREAD, JNIHandles::resolve(installed_code));
    Handle speculation_log_handle(THREAD, JNIHandles::resolve(speculation_log));
  
@@ -685,7 +686,7 @@
    TraceTime install_time("installCode", JVMCICompiler::codeInstallTimer());
    bool is_immutable_PIC = HotSpotCompiledCode::isImmutablePIC(compiled_code_handle) > 0;
    CodeInstaller installer(is_immutable_PIC);
-  JVMCIEnv::CodeInstallResult result = installer.install(compiler, target_handle, compiled_code_handle, cb, installed_code_handle, speculation_log_handle, CHECK_0);
+  JVMCIEnv::CodeInstallResult result = installer.install(compiler, target_handle, compiled_code_handle, cb, cb_name, installed_code_handle, speculation_log_handle, CHECK_0);
  
    if (PrintCodeCacheOnCompilation) {
      stringStream s;
@@ -722,6 +723,7 @@
        }
      }
    }
+  if (cb_name) free(cb_name);
    return result;
  C2V_END
  

----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---


I ran clang static analyzer again, and it is not reproducible owing to I 
fixed the issue, not False negative :)

hotspot:tier1 linux-x86_64-server-fastdebug 2 fail:

* compiler/c2/Test8062950.java: it is also reproducible for mips64el 
without the patch
* runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java: Test 
empty bootstrap_methods table within BootstrapMethods attribute


Please point out my any fault!

Thanks,

Leslie Zhai

[1] 
https://raw.githubusercontent.com/xiangzhai/jdk-dev/master/jvmciCodeInstaller.cpp.png

[2] https://bugs.llvm.org/show_bug.cgi?id=40913

[3] 
https://mail.openjdk.java.net/pipermail/jdk8u-dev/2018-September/007855.html




More information about the jdk-dev mailing list