Совокупное покрытие ветви инициализации - PullRequest
2 голосов
/ 09 апреля 2019

Я создаю инструмент , который по сути является альтернативой lcov. Я пытаюсь сделать так, чтобы создаваемое по умолчанию покрытие ветвей имело как можно меньше шума. Похоже, одним из источников шума ветвления являются списки инициализаторов:

#include <vector>
#include <string>

using namespace std;

struct A {
   vector<string> reference_tokens;
};

int main() {
  A a;

  vector<string> rt = {"a", "b", "c"};

  a.reference_tokens = {rt[0]};
  return 0;
}

Когда я создаю покрытие для этого фрагмента, я получаю:

 9                 :            : struct A {
10                 :            :    vector<string> reference_tokens;
11                 :            : };
12                 :            : 
13                 :          1 : int main() {
14                 :          2 :   A a;
15                 :            : 
16 [ +  - ][ +  - ]:          6 :   vector<string> rt = {"a", "b", "c"};
   [ +  - ][ +  - ]
17                 :            : 
18 [ +  - ][ +  - ]:          2 :   a.reference_tokens = {rt[0]};
   [ +  + ][ -  - ]
19                 :          1 :   return 0;
20                 :            : }

Теперь я понимаю, что GCC вставляет ветви для обработки исключений. Однако, если я отфильтрую исключительные ветви, у меня все равно останется:

 9                 :            : struct A {
10                 :            :    vector<string> reference_tokens;
11                 :            : };
12                 :            : 
13                 :          1 : int main() {
14                 :          2 :   A a;
15                 :            : 
16                 :          6 :   vector<string> rt = {"a", "b", "c"};
17                 :            : 
18 [ +  + ][ -  - ]:          2 :   a.reference_tokens = {rt[0]};
19                 :          1 :   return 0;
20                 :            : }

Я не уверен, для чего эти 4 ветви [ + + ][ - - ]. По словам gcov, они не являются исключительными ветвями, и кажется, что они всегда 1: 1. Например, больший список инициализаторов приведет к [ + + ][ + + ][ + + ][ - - ][ - - ][ - - ] неисключительным ветвям.

Итак, мой вопрос ... что это за ветви? Достижимы ли? Это шум, который можно безопасно удалить?

...