Skip to content

Index out of bounds when parsing profdata #23

@danjujan

Description

@danjujan

I tried to use cov show as a replacement for llvm-cov show on the example C++ program from https://clang.llvm.org/docs/SourceBasedCodeCoverage.html but encountered the following panic:

thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 7', src/coverage/coverage_mapping.rs:514:13
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5
   1: core::panicking::panic_fmt
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14
   2: core::panicking::panic_bounds_check
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:84:5
   3: llvm_profparser::coverage::coverage_mapping::parse_counter
             at ./src/coverage/coverage_mapping.rs:514:13
   4: llvm_profparser::coverage::coverage_mapping::parse_mapping_regions
             at ./src/coverage/coverage_mapping.rs:386:31
   5: llvm_profparser::coverage::coverage_mapping::parse_coverage_functions
             at ./src/coverage/coverage_mapping.rs:332:17
   6: llvm_profparser::coverage::coverage_mapping::read_object_file::{{closure}}
             at ./src/coverage/coverage_mapping.rs:70:18
   7: core::option::Option<T>::map
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/option.rs:929:29
   8: llvm_profparser::coverage::coverage_mapping::read_object_file
             at ./src/coverage/coverage_mapping.rs:67:19
   9: llvm_profparser::coverage::coverage_mapping::CoverageMapping::new
             at ./src/coverage/coverage_mapping.rs:107:31
  10: cov::ShowCommand::run
             at ./src/bin/cov.rs:46:23
  11: cov::main
             at ./src/bin/cov.rs:75:35
  12: core::ops::function::FnOnce::call_once
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5

I know your project is mostly targeted for parsing profiling data from rust programs but since the coverage mapping format is the same it should work universally for other profdata too. Right?

Here are my steps to reproduce:

cd /tmp
git clone https://github.com/xd009642/llvm-profparser.git
cd llvm-profparser

cat <<EOF > foo.cc
#define BAR(x) ((x) || (x))
template <typename T> void foo(T x) {
  for (unsigned I = 0; I < 10; ++I) { BAR(I); }
}
int main() {
  foo<int>(0);
  foo<float>(0);
  return 0;
}
EOF

clang++ -fprofile-instr-generate -fcoverage-mapping foo.cc -o foo
LLVM_PROFILE_FILE="foo.profraw" ./foo
llvm-profdata merge -sparse foo.profraw -o foo.profdata

# Works
llvm-cov show ./foo -instr-profile=foo.profdata

# Works not
RUST_BACKTRACE=1 cargo run --bin cov -- show --instr-profile foo.profdata --object ./foo

OS: Arch Linux
Clang/LLVM version: 14.0.6

Any help to debug this further is highly appreciated!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions