提交 b47a20b8 编写于 作者: Z zgu

8017478: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites

Summary: Fixed possible NULL pointer that caused SIGSEGV
Reviewed-by: coleenp, acorn, ctornqvi
上级 9cf59761
...@@ -188,8 +188,8 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& ...@@ -188,8 +188,8 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline&
(MallocCallsitePointer*)prev_malloc_itr.current(); (MallocCallsitePointer*)prev_malloc_itr.current();
while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) {
if (prev_malloc_callsite == NULL || if (prev_malloc_callsite == NULL) {
cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { assert(cur_malloc_callsite != NULL, "sanity check");
// this is a new callsite // this is a new callsite
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
amount_in_current_scale(cur_malloc_callsite->amount()), amount_in_current_scale(cur_malloc_callsite->amount()),
...@@ -197,22 +197,42 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& ...@@ -197,22 +197,42 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline&
diff_in_current_scale(cur_malloc_callsite->amount(), 0), diff_in_current_scale(cur_malloc_callsite->amount(), 0),
diff(cur_malloc_callsite->count(), 0)); diff(cur_malloc_callsite->count(), 0));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
} else if (cur_malloc_callsite == NULL || } else if (cur_malloc_callsite == NULL) {
cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { assert(prev_malloc_callsite != NULL, "Sanity check");
// this callsite is already gone // this callsite is already gone
_outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
amount_in_current_scale(0), 0, 0, 0,
diff_in_current_scale(0, prev_malloc_callsite->amount()), diff_in_current_scale(0, prev_malloc_callsite->amount()),
diff(0, prev_malloc_callsite->count())); diff(0, prev_malloc_callsite->count()));
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
} else { // the same callsite } else {
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), assert(cur_malloc_callsite != NULL, "Sanity check");
amount_in_current_scale(cur_malloc_callsite->amount()), assert(prev_malloc_callsite != NULL, "Sanity check");
cur_malloc_callsite->count(), if (cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) {
diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), // this is a new callsite
diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); amount_in_current_scale(cur_malloc_callsite->amount()),
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); cur_malloc_callsite->count(),
diff_in_current_scale(cur_malloc_callsite->amount(), 0),
diff(cur_malloc_callsite->count(), 0));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
} else if (cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) {
// this callsite is already gone
_outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
0, 0,
diff_in_current_scale(0, prev_malloc_callsite->amount()),
diff(0, prev_malloc_callsite->count()));
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
} else {
// the same callsite
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
amount_in_current_scale(cur_malloc_callsite->amount()),
cur_malloc_callsite->count(),
diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()),
diff(cur_malloc_callsite->count(), prev_malloc_callsite->count()));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册