Skip to content

Commit dd39114

Browse files
author
kcc
committed
[libFuzzer] better stats for the fork mode
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/fuzzer@354061 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b1fa9e0 commit dd39114

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

FuzzerFork.cpp

+44-5
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,46 @@
1616
#include "FuzzerUtil.h"
1717

1818
#include <atomic>
19+
#include <fstream>
1920
#include <mutex>
20-
#include <thread>
2121
#include <queue>
22+
#include <sstream>
23+
#include <thread>
2224

2325
namespace fuzzer {
2426

27+
struct Stats {
28+
size_t number_of_executed_units = 0;
29+
size_t peak_rss_mb = 0;
30+
size_t average_exec_per_sec = 0;
31+
};
32+
33+
static Stats ParseFinalStatsFromLog(const std::string &LogPath) {
34+
std::ifstream In(LogPath);
35+
std::string Line;
36+
Stats Res;
37+
struct {
38+
const char *Name;
39+
size_t *Var;
40+
} NameVarPairs[] = {
41+
{"stat::number_of_executed_units:", &Res.number_of_executed_units},
42+
{"stat::peak_rss_mb:", &Res.peak_rss_mb},
43+
{"stat::average_exec_per_sec:", &Res.average_exec_per_sec},
44+
{nullptr, nullptr},
45+
};
46+
while (std::getline(In, Line, '\n')) {
47+
if (Line.find("stat::") != 0) continue;
48+
std::istringstream ISS(Line);
49+
std::string Name;
50+
size_t Val;
51+
ISS >> Name >> Val;
52+
for (size_t i = 0; NameVarPairs[i].Name; i++)
53+
if (Name == NameVarPairs[i].Name)
54+
*NameVarPairs[i].Var = Val;
55+
}
56+
return Res;
57+
}
58+
2559
struct FuzzJob {
2660
// Inputs.
2761
Command Cmd;
@@ -43,12 +77,15 @@ struct GlobalEnv {
4377
Random *Rand;
4478
int Verbosity = 0;
4579

80+
size_t NumRuns = 0;
81+
4682
FuzzJob *CreateNewJob(size_t JobId) {
4783
Command Cmd(Args);
4884
Cmd.removeFlag("fork");
4985
for (auto &C : CorpusDirs) // Remove all corpora from the args.
5086
Cmd.removeArgument(C);
5187
Cmd.addFlag("reload", "0"); // working in an isolated dir, no reload.
88+
Cmd.addFlag("print_final_stats", "1");
5289
Cmd.addFlag("max_total_time", std::to_string(std::min((size_t)300, JobId)));
5390

5491
auto Job = new FuzzJob;
@@ -95,12 +132,14 @@ struct GlobalEnv {
95132
WriteToFile(U, NewPath);
96133
Files.push_back(NewPath);
97134
}
98-
Printf("Removing %s\n", Job->CorpusDir.c_str());
99135
RmDirRecursive(Job->CorpusDir);
100136
Features.insert(NewFeatures.begin(), NewFeatures.end());
101-
Printf("INFO: temp_files: %zd files_added: %zd newft: %zd ft: %zd\n",
102-
TempFiles.size(), FilesToAdd.size(), NewFeatures.size(),
103-
Features.size());
137+
auto Stats = ParseFinalStatsFromLog(Job->LogPath);
138+
NumRuns += Stats.number_of_executed_units;
139+
if (!FilesToAdd.empty())
140+
Printf("#%zd: ft: %zd corp: %zd exec/s %zd\n", NumRuns,
141+
Features.size(), Files.size(),
142+
Stats.average_exec_per_sec);
104143
}
105144
};
106145

0 commit comments

Comments
 (0)