Program: 199033
Project: 199033
Buggy source:
private int[] collectStats(String statsFile,int parentPid,boolean first,int[] curPids,ArrayList<Stats> allProcs){
  int[] pids=Process.getPids(statsFile,curPids);
  int NP=(pids == null) ? 0 : pids.length;
  int NS=allProcs.size();
  int curStatsIndex=0;
  for (int i=0; i < NP; i++) {
    int pid=pids[i];
    if (pid < 0) {
      NP=pid;
      break;
    }
    Stats st=curStatsIndex < NS ? allProcs.get(curStatsIndex) : null;
    if (st != null && st.pid == pid) {
      st.added=false;
      st.working=false;
      curStatsIndex++;
      if (DEBUG)       Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
      if (st.interesting) {
        final long uptime=SystemClock.uptimeMillis();
        final long[] procStats=mProcessStatsData;
        if (!Process.readProcFile(st.statFile.toString(),PROCESS_STATS_FORMAT,null,procStats,null)) {
          continue;
        }
        final long minfaults=procStats[PROCESS_STAT_MINOR_FAULTS];
        final long majfaults=procStats[PROCESS_STAT_MAJOR_FAULTS];
        final long utime=procStats[PROCESS_STAT_UTIME];
        final long stime=procStats[PROCESS_STAT_STIME];
        if (utime == st.base_utime && stime == st.base_stime) {
          st.rel_utime=0;
          st.rel_stime=0;
          st.rel_minfaults=0;
          st.rel_majfaults=0;
          if (st.active) {
            st.active=false;
          }
          continue;
        }
        if (!st.active) {
          st.active=true;
        }
        if (parentPid < 0) {
          getName(st,st.cmdlineFile);
          if (st.threadStats != null) {
            mCurThreadPids=collectStats(st.threadsDir,pid,false,mCurThreadPids,st.threadStats);
          }
        }
        if (DEBUG)         Slog.v("String_Node_Str","String_Node_Str" + st.name + "String_Node_Str"+ st.pid+ "String_Node_Str"+ utime+ "String_Node_Str"+ st.base_utime+ "String_Node_Str"+ stime+ "String_Node_Str"+ st.base_stime+ "String_Node_Str"+ minfaults+ "String_Node_Str"+ st.base_minfaults+ "String_Node_Str"+ majfaults+ "String_Node_Str"+ st.base_majfaults);
        st.rel_uptime=uptime - st.base_uptime;
        st.base_uptime=uptime;
        st.rel_utime=(int)(utime - st.base_utime);
        st.rel_stime=(int)(stime - st.base_stime);
        st.base_utime=utime;
        st.base_stime=stime;
        st.rel_minfaults=(int)(minfaults - st.base_minfaults);
        st.rel_majfaults=(int)(majfaults - st.base_majfaults);
        st.base_minfaults=minfaults;
        st.base_majfaults=majfaults;
        st.working=true;
      }
      continue;
    }
    if (st == null || st.pid > pid) {
      st=new Stats(pid,parentPid,mIncludeThreads);
      allProcs.add(curStatsIndex,st);
      curStatsIndex++;
      NS++;
      if (DEBUG)       Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
      final String[] procStatsString=mProcessFullStatsStringData;
      final long[] procStats=mProcessFullStatsData;
      st.base_uptime=SystemClock.uptimeMillis();
      if (Process.readProcFile(st.statFile.toString(),PROCESS_FULL_STATS_FORMAT,procStatsString,procStats,null)) {
        st.vsize=procStats[PROCESS_FULL_STAT_VSIZE];
        if (true || procStats[PROCESS_FULL_STAT_VSIZE] != 0) {
          st.interesting=true;
          st.baseName=procStatsString[0];
          st.base_minfaults=procStats[PROCESS_FULL_STAT_MINOR_FAULTS];
          st.base_majfaults=procStats[PROCESS_FULL_STAT_MAJOR_FAULTS];
          st.base_utime=procStats[PROCESS_FULL_STAT_UTIME];
          st.base_stime=procStats[PROCESS_FULL_STAT_STIME];
        }
 else {
          Slog.i(TAG,"String_Node_Str" + pid + "String_Node_Str"+ procStatsString[0]);
          st.baseName=procStatsString[0];
        }
      }
 else {
        Slog.w(TAG,"String_Node_Str" + pid);
        st.baseName="String_Node_Str";
        st.base_utime=st.base_stime=0;
        st.base_minfaults=st.base_majfaults=0;
      }
      if (parentPid < 0) {
        getName(st,st.cmdlineFile);
        if (st.threadStats != null) {
          mCurThreadPids=collectStats(st.threadsDir,pid,true,mCurThreadPids,st.threadStats);
        }
      }
 else       if (st.interesting) {
        st.name=st.baseName;
        st.nameWidth=onMeasureProcessName(st.name);
      }
      if (DEBUG)       Slog.v("String_Node_Str","String_Node_Str" + st.name + "String_Node_Str"+ st.pid+ "String_Node_Str"+ st.base_utime+ "String_Node_Str"+ st.base_stime+ "String_Node_Str"+ st.base_minfaults+ "String_Node_Str"+ st.base_majfaults);
      st.rel_utime=0;
      st.rel_stime=0;
      st.rel_minfaults=0;
      st.rel_majfaults=0;
      st.added=true;
      if (!first && st.interesting) {
        st.working=true;
      }
      continue;
    }
    st.rel_utime=0;
    st.rel_stime=0;
    st.rel_minfaults=0;
    st.rel_majfaults=0;
    st.removed=true;
    st.working=true;
    allProcs.remove(curStatsIndex);
    NS--;
    if (DEBUG)     Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
    i--;
    continue;
  }
  while (curStatsIndex < NS) {
    final Stats st=allProcs.get(curStatsIndex);
    st.rel_utime=0;
    st.rel_stime=0;
    st.rel_minfaults=0;
    st.rel_majfaults=0;
    st.removed=true;
    st.working=true;
    allProcs.remove(curStatsIndex);
    NS--;
    if (localLOGV)     Slog.v(TAG,"String_Node_Str" + st.pid + "String_Node_Str"+ st);
  }
  return pids;
}

Fixed version (ground truth):
private int[] collectStats(String statsFile,int parentPid,boolean first,int[] curPids,ArrayList<Stats> allProcs){
  int[] pids=Process.getPids(statsFile,curPids);
  int NP=(pids == null) ? 0 : pids.length;
  int NS=allProcs.size();
  int curStatsIndex=0;
  for (int i=0; i < NP; i++) {
    int pid=pids[i];
    if (pid < 0) {
      NP=pid;
      break;
    }
    Stats st=curStatsIndex < NS ? allProcs.get(curStatsIndex) : null;
    if (st != null && st.pid == pid) {
      st.added=false;
      st.working=false;
      curStatsIndex++;
      if (DEBUG)       Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
      if (st.interesting) {
        final long uptime=SystemClock.uptimeMillis();
        final long[] procStats=mProcessStatsData;
        if (!Process.readProcFile(st.statFile.toString(),PROCESS_STATS_FORMAT,null,procStats,null)) {
          continue;
        }
        final long minfaults=procStats[PROCESS_STAT_MINOR_FAULTS];
        final long majfaults=procStats[PROCESS_STAT_MAJOR_FAULTS];
        final long utime=procStats[PROCESS_STAT_UTIME];
        final long stime=procStats[PROCESS_STAT_STIME];
        if (utime == st.base_utime && stime == st.base_stime) {
          st.rel_utime=0;
          st.rel_stime=0;
          st.rel_minfaults=0;
          st.rel_majfaults=0;
          if (st.active) {
            st.active=false;
          }
          continue;
        }
        if (!st.active) {
          st.active=true;
        }
        if (parentPid < 0) {
          getName(st,st.cmdlineFile);
          if (st.threadStats != null) {
            mCurThreadPids=collectStats(st.threadsDir,pid,false,mCurThreadPids,st.threadStats);
          }
        }
        if (DEBUG)         Slog.v("String_Node_Str","String_Node_Str" + st.name + "String_Node_Str"+ st.pid+ "String_Node_Str"+ utime+ "String_Node_Str"+ st.base_utime+ "String_Node_Str"+ stime+ "String_Node_Str"+ st.base_stime+ "String_Node_Str"+ minfaults+ "String_Node_Str"+ st.base_minfaults+ "String_Node_Str"+ majfaults+ "String_Node_Str"+ st.base_majfaults);
        st.rel_uptime=uptime - st.base_uptime;
        st.base_uptime=uptime;
        st.rel_utime=(int)(utime - st.base_utime);
        st.rel_stime=(int)(stime - st.base_stime);
        st.base_utime=utime;
        st.base_stime=stime;
        st.rel_minfaults=(int)(minfaults - st.base_minfaults);
        st.rel_majfaults=(int)(majfaults - st.base_majfaults);
        st.base_minfaults=minfaults;
        st.base_majfaults=majfaults;
        st.working=true;
      }
      continue;
    }
    if (st == null || st.pid > pid) {
      st=new Stats(pid,parentPid,mIncludeThreads);
      allProcs.add(curStatsIndex,st);
      curStatsIndex++;
      NS++;
      if (DEBUG)       Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
      final String[] procStatsString=mProcessFullStatsStringData;
      final long[] procStats=mProcessFullStatsData;
      st.base_uptime=SystemClock.uptimeMillis();
      String path=st.statFile.toString();
      if (Process.readProcFile(path,PROCESS_FULL_STATS_FORMAT,procStatsString,procStats,null)) {
        st.vsize=procStats[PROCESS_FULL_STAT_VSIZE];
        if (true || procStats[PROCESS_FULL_STAT_VSIZE] != 0) {
          st.interesting=true;
          st.baseName=procStatsString[0];
          st.base_minfaults=procStats[PROCESS_FULL_STAT_MINOR_FAULTS];
          st.base_majfaults=procStats[PROCESS_FULL_STAT_MAJOR_FAULTS];
          st.base_utime=procStats[PROCESS_FULL_STAT_UTIME];
          st.base_stime=procStats[PROCESS_FULL_STAT_STIME];
        }
 else {
          Slog.i(TAG,"String_Node_Str" + pid + "String_Node_Str"+ procStatsString[0]);
          st.baseName=procStatsString[0];
        }
      }
 else {
        Slog.w(TAG,"String_Node_Str" + pid);
        st.baseName="String_Node_Str";
        st.base_utime=st.base_stime=0;
        st.base_minfaults=st.base_majfaults=0;
      }
      if (parentPid < 0) {
        getName(st,st.cmdlineFile);
        if (st.threadStats != null) {
          mCurThreadPids=collectStats(st.threadsDir,pid,true,mCurThreadPids,st.threadStats);
        }
      }
 else       if (st.interesting) {
        st.name=st.baseName;
        st.nameWidth=onMeasureProcessName(st.name);
      }
      if (DEBUG)       Slog.v("String_Node_Str","String_Node_Str" + st.name + "String_Node_Str"+ st.pid+ "String_Node_Str"+ st.base_utime+ "String_Node_Str"+ st.base_stime+ "String_Node_Str"+ st.base_minfaults+ "String_Node_Str"+ st.base_majfaults);
      st.rel_utime=0;
      st.rel_stime=0;
      st.rel_minfaults=0;
      st.rel_majfaults=0;
      st.added=true;
      if (!first && st.interesting) {
        st.working=true;
      }
      continue;
    }
    st.rel_utime=0;
    st.rel_stime=0;
    st.rel_minfaults=0;
    st.rel_majfaults=0;
    st.removed=true;
    st.working=true;
    allProcs.remove(curStatsIndex);
    NS--;
    if (DEBUG)     Slog.v(TAG,"String_Node_Str" + (parentPid < 0 ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ pid+ "String_Node_Str"+ st);
    i--;
    continue;
  }
  while (curStatsIndex < NS) {
    final Stats st=allProcs.get(curStatsIndex);
    st.rel_utime=0;
    st.rel_stime=0;
    st.rel_minfaults=0;
    st.rel_majfaults=0;
    st.removed=true;
    st.working=true;
    allProcs.remove(curStatsIndex);
    NS--;
    if (localLOGV)     Slog.v(TAG,"String_Node_Str" + st.pid + "String_Node_Str"+ st);
  }
  return pids;
}