MCPcopy Create free account
hub / github.com/FuzzAnything/PromptFuzz / parse_lcov_data

Function parse_lcov_data

src/feedback/clang_coverage.rs:629–689  ·  view source on GitHub ↗

parse line coverage of library from lcov data

(lcov: &str, coverage: &mut CodeCoverage)

Source from the content-addressed store, hash-verified

627
628 /// parse line coverage of library from lcov data
629 pub fn parse_lcov_data(lcov: &str, coverage: &mut CodeCoverage) -> Result<()> {
630 let mut de = crate::program::serde::Deserializer::from_input(lcov);
631 // fn: line of function begion, function name;
632 while de.is_next_token("SF:") {
633 let mut fns: Vec<(usize, &str)> = Vec::new();
634 de.eat_token("SF:")?;
635 let _sf = de.consume_token_until("\n")?;
636 // parse function lines
637 while de.is_next_token("FN:") {
638 de.eat_token("FN:")?;
639 let line: usize = de.parse_number()?;
640 de.eat_token(",")?;
641 let f_name = de.consume_token_until("\n")?;
642 fns.push((line, f_name));
643 }
644 fns.sort_by(|a, b| a.0.cmp(&b.0));
645
646 let mut line_counts: Vec<(usize, usize)> = Vec::new();
647 de.eat_token_until("FNH:")?;
648 de.eat_token_until("DA:")?;
649 while de.is_next_token("DA:") {
650 de.eat_token("DA:")?;
651 let line: usize = de.parse_number()?;
652 de.eat_token(",")?;
653 let count: usize = de.parse_number()?;
654 line_counts.push((line, count));
655 }
656
657 let mut i = 0;
658 let mut j = 0;
659 while i < fns.len() && j < line_counts.len() {
660 let (cur_begin, f_name) = fns[i];
661 let (line, count) = line_counts[j];
662 if line < cur_begin {
663 j += 1;
664 continue;
665 }
666 // if cur fn is the last one
667 if i == fns.len() - 1 {
668 let func_cov = coverage.get_function_cov_mut(f_name).unwrap();
669 func_cov.lines.push([line, count]);
670 j += 1;
671 } else {
672 let (next_begin, _) = fns[i + 1];
673 // if line still in the range of f_name
674 if line < next_begin {
675 let func_cov = coverage
676 .get_function_cov_mut(f_name)
677 .unwrap_or_else(|| panic!("cannot obtain coverage of :{f_name}"));
678 func_cov.lines.push([line, count]);
679 j += 1;
680 // else get the next fn
681 } else {
682 i += 1;
683 }
684 }
685 }
686 de.consume_token_until("end_of_record")?;

Callers

nothing calls this directly

Calls 7

is_next_tokenMethod · 0.80
eat_tokenMethod · 0.80
consume_token_untilMethod · 0.80
parse_numberMethod · 0.80
eat_token_untilMethod · 0.80
get_function_cov_mutMethod · 0.80
pushMethod · 0.45

Tested by

no test coverage detected