< prev index next >

src/hotspot/share/code/codeHeapState.cpp

Print this page
rev 51015 : 8207342: error occurred during error reporting (printing register info)
Summary: os::print_location misses a check if the pointer is readable.
Reviewed-by:

@@ -2104,12 +2104,12 @@
       // heap->find_start() is safe. Only working with _segmap. Returns NULL or void*. Returned CodeBlob may be uninitialized.
       CodeBlob* this_blob = (CodeBlob *)(heap->find_start(low_bound+ix*granule_size+is));
       bool blob_initialized = (this_blob != NULL) && (this_blob->header_size() >= 0) && (this_blob->relocation_size() >= 0) &&
                               ((address)this_blob + this_blob->header_size() == (address)(this_blob->relocation_begin())) &&
                               ((address)this_blob + CodeBlob::align_code_offset(this_blob->header_size() + this_blob->relocation_size()) == (address)(this_blob->content_begin())) &&
-                              is_readable_pointer((address)(this_blob->relocation_begin())) &&
-                              is_readable_pointer(this_blob->content_begin());
+                              os::is_readable_pointer((address)(this_blob->relocation_begin())) &&
+                              os::is_readable_pointer(this_blob->content_begin());
       // blob could have been flushed, freed, and merged.
       // this_blob < last_blob is an indicator for that.
       if (blob_initialized && (this_blob > last_blob)) {
         last_blob          = this_blob;
 

@@ -2120,11 +2120,11 @@
         } else {
           cbType = get_cbType(this_blob);
         }
         // this_blob->name() could return NULL if no name was given to CTOR. Inlined, maybe invisible on stack
         const char* blob_name = this_blob->name();
-        if ((blob_name == NULL) || !is_readable_pointer(blob_name)) {
+        if ((blob_name == NULL) || !os::is_readable_pointer(blob_name)) {
           blob_name = "<unavailable>";
         }
 
         //---<  print table header for new print range  >---
         if (!name_in_addr_range) {

@@ -2145,11 +2145,11 @@
 
         // this_blob->as_nmethod_or_null() is safe. Inlined, maybe invisible on stack.
         nmethod*    nm     = this_blob->as_nmethod_or_null();
         Method*     method = (nm == NULL) ? NULL : nm->method();  // may be uninitialized, i.e. != NULL, but invalid
         if ((nm != NULL) && (method != NULL) && (cbType != nMethod_dead) &&
-            is_readable_pointer(method) && is_readable_pointer(method->constants())) {
+            os::is_readable_pointer(method) && os::is_readable_pointer(method->constants())) {
           ResourceMark rm;
           //---<  collect all data to locals as quickly as possible  >---
           unsigned int total_size = nm->total_size();
           int          hotness    = nm->hotness_counter();
           bool         get_name   = (cbType == nMethod_inuse) || (cbType == nMethod_notused);

@@ -2344,11 +2344,11 @@
     ast->print("(+" PTR32_FORMAT "): |", (unsigned int)(ix*granule_size));
   }
 }
 
 CodeHeapState::blobType CodeHeapState::get_cbType(CodeBlob* cb) {
-  if ((cb != NULL) && is_readable_pointer(cb)) {
+  if ((cb != NULL) && os::is_readable_pointer(cb)) {
     if (cb->is_runtime_stub())                return runtimeStub;
     if (cb->is_deoptimization_stub())         return deoptimizationStub;
     if (cb->is_uncommon_trap_stub())          return uncommonTrapStub;
     if (cb->is_exception_stub())              return exceptionStub;
     if (cb->is_safepoint_stub())              return safepointStub;

@@ -2366,19 +2366,5 @@
       return nMethod_dead;
     }
   }
   return noType;
 }
-
-// Check if pointer can be read from (4-byte read access).
-// Helps to prove validity of a not-NULL pointer.
-// Returns true in very early stages of VM life when stub is not yet generated.
-#define SAFEFETCH_DEFAULT true
-bool CodeHeapState::is_readable_pointer(const void* p) {
-  if (!CanUseSafeFetch32()) {
-    return SAFEFETCH_DEFAULT;
-  }
-  int* const aligned = (int*) align_down((intptr_t)p, 4);
-  int cafebabe = 0xcafebabe;  // tester value 1
-  int deadbeef = 0xdeadbeef;  // tester value 2
-  return (SafeFetch32(aligned, cafebabe) != cafebabe) || (SafeFetch32(aligned, deadbeef) != deadbeef);
-}
< prev index next >