diff options
author | Tomohiro Kashiwada <kikairoya@gmail.com> | 2025-09-12 05:12:54 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-11 23:12:54 +0300 |
commit | ca09801bd03579f28edac60077a164fab0474eb4 (patch) | |
tree | 22e5935f7b82bd52c3b12d18c7b4e2927dd0e82f /llvm/unittests/ProfileData/CoverageMappingTest.cpp | |
parent | eb3b7ddc697c379894dc9b09b158697d44f7c25b (diff) | |
download | llvm-ca09801bd03579f28edac60077a164fab0474eb4.zip llvm-ca09801bd03579f28edac60077a164fab0474eb4.tar.gz llvm-ca09801bd03579f28edac60077a164fab0474eb4.tar.bz2 |
[LLVM][Coverage][Unittest] Fix dangling reference in unittest (#147118)
In loop of `writeAndReadCoverageRegions`, `OutputFunctions[I].Filenames`
references to contents of `Filenames` after returning from
`readCoverageRegions` but `Filenames` will be cleared in next call of
`readCoverageRegions`, causes dangling reference.
The lifetime of the contents of `Filenames` must be equal or longer than
`OutputFunctions[I]`, thus it has been moved into `OutputFunctions[I]`
(typed `OutputFunctionCoverageData`).
Diffstat (limited to 'llvm/unittests/ProfileData/CoverageMappingTest.cpp')
-rw-r--r-- | llvm/unittests/ProfileData/CoverageMappingTest.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp index ec81e5f..b268aa7 100644 --- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp +++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp @@ -64,6 +64,7 @@ namespace { struct OutputFunctionCoverageData { StringRef Name; uint64_t Hash; + std::vector<std::string> FilenamesStorage; std::vector<StringRef> Filenames; std::vector<CounterMappingRegion> Regions; std::vector<CounterExpression> Expressions; @@ -71,8 +72,10 @@ struct OutputFunctionCoverageData { OutputFunctionCoverageData() : Hash(0) {} OutputFunctionCoverageData(OutputFunctionCoverageData &&OFCD) - : Name(OFCD.Name), Hash(OFCD.Hash), Filenames(std::move(OFCD.Filenames)), - Regions(std::move(OFCD.Regions)) {} + : Name(OFCD.Name), Hash(OFCD.Hash), + FilenamesStorage(std::move(OFCD.FilenamesStorage)), + Filenames(std::move(OFCD.Filenames)), Regions(std::move(OFCD.Regions)) { + } OutputFunctionCoverageData(const OutputFunctionCoverageData &) = delete; OutputFunctionCoverageData & @@ -135,7 +138,6 @@ struct InputFunctionCoverageData { struct CoverageMappingTest : ::testing::TestWithParam<std::tuple<bool, bool>> { bool UseMultipleReaders; StringMap<unsigned> Files; - std::vector<std::string> Filenames; std::vector<InputFunctionCoverageData> InputFunctions; std::vector<OutputFunctionCoverageData> OutputFunctions; @@ -233,13 +235,11 @@ struct CoverageMappingTest : ::testing::TestWithParam<std::tuple<bool, bool>> { void readCoverageRegions(const std::string &Coverage, OutputFunctionCoverageData &Data) { - // We will re-use the StringRef in duplicate tests, clear it to avoid - // clobber previous ones. - Filenames.clear(); - Filenames.resize(Files.size() + 1); + // +1 here since `Files` (filename to index map) uses 1-based index. + Data.FilenamesStorage.resize(Files.size() + 1); for (const auto &E : Files) - Filenames[E.getValue()] = E.getKey().str(); - ArrayRef<std::string> FilenameRefs = llvm::ArrayRef(Filenames); + Data.FilenamesStorage[E.getValue()] = E.getKey().str(); + ArrayRef<std::string> FilenameRefs = llvm::ArrayRef(Data.FilenamesStorage); RawCoverageMappingReader Reader(Coverage, FilenameRefs, Data.Filenames, Data.Expressions, Data.Regions); EXPECT_THAT_ERROR(Reader.read(), Succeeded()); |