mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
6973963: SEGV in ciBlock::start_bci() with EA
Added more checks into ResourceObj and growableArray to verify correctness of allocation type. Reviewed-by: never, coleenp, dholmes
This commit is contained in:
parent
f0b6dc4e4f
commit
5bed80aab9
17 changed files with 128 additions and 43 deletions
|
@ -316,32 +316,41 @@ extern void resource_free_bytes( char *old, size_t size );
|
|||
// use delete to deallocate.
|
||||
class ResourceObj ALLOCATION_SUPER_CLASS_SPEC {
|
||||
public:
|
||||
enum allocation_type { UNKNOWN = 0, C_HEAP, RESOURCE_AREA, ARENA };
|
||||
enum allocation_type { STACK_OR_EMBEDDED = 0, RESOURCE_AREA, C_HEAP, ARENA, allocation_mask = 0x3 };
|
||||
#ifdef ASSERT
|
||||
private:
|
||||
allocation_type _allocation;
|
||||
// When this object is allocated on stack the new() operator is not
|
||||
// called but garbage on stack may look like a valid allocation_type.
|
||||
// Store negated 'this' pointer when new() is called to distinguish cases.
|
||||
uintptr_t _allocation;
|
||||
public:
|
||||
bool allocated_on_C_heap() { return _allocation == C_HEAP; }
|
||||
static void set_allocation_type(address res, allocation_type type);
|
||||
allocation_type get_allocation_type();
|
||||
bool allocated_on_stack() { return get_allocation_type() == STACK_OR_EMBEDDED; }
|
||||
bool allocated_on_res_area() { return get_allocation_type() == RESOURCE_AREA; }
|
||||
bool allocated_on_C_heap() { return get_allocation_type() == C_HEAP; }
|
||||
bool allocated_on_arena() { return get_allocation_type() == ARENA; }
|
||||
ResourceObj(); // default construtor
|
||||
ResourceObj(const ResourceObj& r); // default copy construtor
|
||||
ResourceObj& operator=(const ResourceObj& r); // default copy assignment
|
||||
~ResourceObj();
|
||||
#endif // ASSERT
|
||||
|
||||
public:
|
||||
void* operator new(size_t size, allocation_type type);
|
||||
void* operator new(size_t size, Arena *arena) {
|
||||
address res = (address)arena->Amalloc(size);
|
||||
// Set allocation type in the resource object
|
||||
DEBUG_ONLY(((ResourceObj *)res)->_allocation = ARENA;)
|
||||
DEBUG_ONLY(set_allocation_type(res, ARENA);)
|
||||
return res;
|
||||
}
|
||||
void* operator new(size_t size) {
|
||||
address res = (address)resource_allocate_bytes(size);
|
||||
// Set allocation type in the resource object
|
||||
DEBUG_ONLY(((ResourceObj *)res)->_allocation = RESOURCE_AREA;)
|
||||
DEBUG_ONLY(set_allocation_type(res, RESOURCE_AREA);)
|
||||
return res;
|
||||
}
|
||||
void* operator new(size_t size, void* where, allocation_type type) {
|
||||
void* res = where;
|
||||
// Set allocation type in the resource object
|
||||
DEBUG_ONLY(((ResourceObj *)res)->_allocation = type;)
|
||||
address res = (address)where;
|
||||
DEBUG_ONLY(set_allocation_type(res, type);)
|
||||
return res;
|
||||
}
|
||||
void operator delete(void* p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue