Я создаю инструмент , который по сути является альтернативой 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. Например, больший список инициализаторов приведет к [ + + ][ + + ][ + + ][ - - ][ - - ][ - - ]
неисключительным ветвям.
Итак, мой вопрос ... что это за ветви? Достижимы ли? Это шум, который можно безопасно удалить?