[LSan] Rework r191522 - treat allocations with short stack traces as live
llvm-svn: 191662
This commit is contained in:
		
							parent
							
								
									d30ac3a125
								
							
						
					
					
						commit
						3b54a83d26
					
				| 
						 | 
				
			
			@ -295,14 +295,10 @@ static void CollectLeaksCb(uptr chunk, void *arg) {
 | 
			
		|||
  LsanMetadata m(chunk);
 | 
			
		||||
  if (!m.allocated()) return;
 | 
			
		||||
  if (m.tag() == kDirectlyLeaked || m.tag() == kIndirectlyLeaked) {
 | 
			
		||||
    uptr size = 0;
 | 
			
		||||
    const uptr *trace = StackDepotGet(m.stack_trace_id(), &size);
 | 
			
		||||
    // Ignore leaks with one-frame stack traces (which often come from
 | 
			
		||||
    // coroutines) - they are not actionable.
 | 
			
		||||
    if (size <= 1)
 | 
			
		||||
      return;
 | 
			
		||||
    uptr resolution = flags()->resolution;
 | 
			
		||||
    if (resolution > 0) {
 | 
			
		||||
      uptr size = 0;
 | 
			
		||||
      const uptr *trace = StackDepotGet(m.stack_trace_id(), &size);
 | 
			
		||||
      size = Min(size, resolution);
 | 
			
		||||
      leak_report->Add(StackDepotPut(trace, size), m.requested_size(), m.tag());
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -115,8 +115,12 @@ static void ProcessPlatformSpecificAllocationsCb(uptr chunk, void *arg) {
 | 
			
		|||
  LsanMetadata m(chunk);
 | 
			
		||||
  if (m.allocated() && m.tag() != kReachable) {
 | 
			
		||||
    u32 stack_id = m.stack_trace_id();
 | 
			
		||||
    if (!stack_id || linker->containsAddress(GetCallerPC(
 | 
			
		||||
                         stack_id, param->stack_depot_reverse_map))) {
 | 
			
		||||
    uptr caller_pc = 0;
 | 
			
		||||
    if (stack_id > 0)
 | 
			
		||||
      caller_pc = GetCallerPC(stack_id, param->stack_depot_reverse_map);
 | 
			
		||||
    // If caller_pc is unknown, this chunk may be allocated in a coroutine. Mark
 | 
			
		||||
    // it as reachable, as we can't properly report its allocation stack anyway.
 | 
			
		||||
    if (caller_pc == 0 || linker->containsAddress(caller_pc)) {
 | 
			
		||||
      m.set_tag(kReachable);
 | 
			
		||||
      param->frontier->push_back(chunk);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue