authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-08-04 16:09:14-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-08-07 00:48:32-07:00
log6e6164f8a6c74c8ea5a87ac9961b491b9f89b780
tree475ac823f86b7d22d8a93205eea4d24c15d972a2
parentf56d11350313d5e45be0679bd8fab2a96892c40c

fuzzer web ui: add coverage stat


3 files changed, 16 insertions(+), 0 deletions(-)

lib/fuzzer/index.html+1
...@@ -129,6 +129,7 @@...@@ -129,6 +129,7 @@
129 <ul>129 <ul>
130 <li>Total Runs: <span id="statTotalRuns"></span></li>130 <li>Total Runs: <span id="statTotalRuns"></span></li>
131 <li>Unique Runs: <span id="statUniqueRuns"></span></li>131 <li>Unique Runs: <span id="statUniqueRuns"></span></li>
132 <li>Coverage: <span id="statCoverage"></span></li>
132 <li>Lowest Stack: <span id="statLowestStack"></span></li>133 <li>Lowest Stack: <span id="statLowestStack"></span></li>
133 </ul>134 </ul>
134 </div>135 </div>
lib/fuzzer/main.js+4
...@@ -5,6 +5,7 @@...@@ -5,6 +5,7 @@
5 const domSourceText = document.getElementById("sourceText");5 const domSourceText = document.getElementById("sourceText");
6 const domStatTotalRuns = document.getElementById("statTotalRuns");6 const domStatTotalRuns = document.getElementById("statTotalRuns");
7 const domStatUniqueRuns = document.getElementById("statUniqueRuns");7 const domStatUniqueRuns = document.getElementById("statUniqueRuns");
8 const domStatCoverage = document.getElementById("statCoverage");
8 const domStatLowestStack = document.getElementById("statLowestStack");9 const domStatLowestStack = document.getElementById("statLowestStack");
910
10 let wasm_promise = fetch("main.wasm");11 let wasm_promise = fetch("main.wasm");
...@@ -112,8 +113,11 @@...@@ -112,8 +113,11 @@
112 function renderStats() {113 function renderStats() {
113 const totalRuns = wasm_exports.totalRuns();114 const totalRuns = wasm_exports.totalRuns();
114 const uniqueRuns = wasm_exports.uniqueRuns();115 const uniqueRuns = wasm_exports.uniqueRuns();
116 const totalSourceLocations = wasm_exports.totalSourceLocations();
117 const coveredSourceLocations = wasm_exports.coveredSourceLocations();
115 domStatTotalRuns.innerText = totalRuns;118 domStatTotalRuns.innerText = totalRuns;
116 domStatUniqueRuns.innerText = uniqueRuns + " (" + percent(uniqueRuns, totalRuns) + "%)";119 domStatUniqueRuns.innerText = uniqueRuns + " (" + percent(uniqueRuns, totalRuns) + "%)";
120 domStatCoverage.innerText = coveredSourceLocations + " / " + totalSourceLocations + " (" + percent(coveredSourceLocations, totalSourceLocations) + "%)";
117 domStatLowestStack.innerText = unwrapString(wasm_exports.lowestStack());121 domStatLowestStack.innerText = unwrapString(wasm_exports.lowestStack());
118122
119 domSectStats.classList.remove("hidden");123 domSectStats.classList.remove("hidden");
lib/fuzzer/wasm/main.zig+11
...@@ -110,6 +110,17 @@ export fn lowestStack() String {...@@ -110,6 +110,17 @@ export fn lowestStack() String {
110 return String.init(string_result.items);110 return String.init(string_result.items);
111}111}
112112
113export fn totalSourceLocations() usize {
114 return coverage_source_locations.items.len;
115}
116
117export fn coveredSourceLocations() usize {
118 const covered_bits = recent_coverage_update.items[@sizeOf(abi.CoverageUpdateHeader)..];
119 var count: usize = 0;
120 for (covered_bits) |byte| count += @popCount(byte);
121 return count;
122}
123
113export fn totalRuns() u64 {124export fn totalRuns() u64 {
114 const header: *abi.CoverageUpdateHeader = @ptrCast(recent_coverage_update.items[0..@sizeOf(abi.CoverageUpdateHeader)]);125 const header: *abi.CoverageUpdateHeader = @ptrCast(recent_coverage_update.items[0..@sizeOf(abi.CoverageUpdateHeader)]);
115 return header.n_runs;126 return header.n_runs;