Как читать формат JVL llvm-cov? - PullRequest
1 голос
/ 07 мая 2019

Я могу экспортировать данные покрытия кода с помощью llvm-cov в формате json, но содержимое мне кажется загадочным. Что означает каждое число в разделе segments?

{
   "filename":"file.m",
   "segments":[
      [
         11,
         22,
         23,
         1,
         1
      ],
      [
         12,
         11,
         23,
         1,
         1
      ],
      ...
   ],
   "expansions":[

   ],
   "summary":{
      ...
   }
}

1 Ответ

0 голосов
/ 27 июня 2019

Исходя из https://clang.llvm.org/docs/SourceBasedCodeCoverage.html, формат JSON объясняется в исходном коде, который я нашел в https://github.com/llvm-mirror/llvm/tree/master/tools/llvm-cov.

Исходный код содержит следующее описание:

The json code coverage export follows the following format
Root: dict => Root Element containing metadata
-- Data: array => Homogeneous array of one or more export objects
    -- Export: dict => Json representation of one CoverageMapping
    -- Files: array => List of objects describing coverage for files
        -- File: dict => Coverage for a single file
        -- Segments: array => List of Segments contained in the file
            -- Segment: dict => Describes a segment of the file with a counter
        -- Expansions: array => List of expansion records
            -- Expansion: dict => Object that descibes a single expansion
            -- CountedRegion: dict => The region to be expanded
            -- TargetRegions: array => List of Regions in the expansion
                -- CountedRegion: dict => Single Region in the expansion
        -- Summary: dict => Object summarizing the coverage for this file
            -- LineCoverage: dict => Object summarizing line coverage
            -- FunctionCoverage: dict => Object summarizing function coverage
            -- RegionCoverage: dict => Object summarizing region coverage
    -- Functions: array => List of objects describing coverage for functions
        -- Function: dict => Coverage info for a single function
        -- Filenames: array => List of filenames that the function relates to
    -- Summary: dict => Object summarizing the coverage for the entire binary
    -- LineCoverage: dict => Object summarizing line coverage
    -- FunctionCoverage: dict => Object summarizing function coverage
    -- InstantiationCoverage: dict => Object summarizing inst. coverage
    -- RegionCoverage: dict => Object summarizing region coverage

К сожалению, это все еще не очень объясняет, что такое сегмент или как он структурирован.

Глядя немного подробнее на код, мы находим следующие два фрагмента:

json::Array renderSegment(const coverage::CoverageSegment &Segment) {
  return json::Array({Segment.Line, Segment.Col, int64_t(Segment.Count),
                      Segment.HasCount, Segment.IsRegionEntry});
}
json::Array renderRegion(const coverage::CountedRegion &Region) {
  return json::Array({Region.LineStart, Region.ColumnStart, Region.LineEnd,
                      Region.ColumnEnd, int64_t(Region.ExecutionCount),
                      Region.FileID, Region.ExpandedFileID,
                      int64_t(Region.Kind)});
}

Что должно дать вам лучшее представление о значении этих записей.

Кажется, что идентификатор файла индексируется в именах файлов, указанных в расширениях.

...