Coverage Report

Created: 2026-04-23 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/igraph/fuzzing/linear_algos_undirected.cpp
Line
Count
Source
1
/*
2
   igraph library.
3
   Copyright (C) 2024  The igraph development team
4
5
   This program is free software; you can redistribute it and/or modify
6
   it under the terms of the GNU General Public License as published by
7
   the Free Software Foundation; either version 2 of the License, or
8
   (at your option) any later version.
9
10
   This program is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
   GNU General Public License for more details.
14
15
   You should have received a copy of the GNU General Public License
16
   along with this program; if not, write to the Free Software
17
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
   02110-1301 USA
19
*/
20
21
#include <igraph.h>
22
#include <cstdlib>
23
24
#include "fuzz_utilities.h"
25
26
2.18k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
27
2.18k
    igraph_t graph;
28
2.18k
    igraph_vector_int_t edges;
29
30
2.18k
    igraph_set_warning_handler(igraph_warning_handler_ignore);
31
32
2.18k
    if (Size % 2 == 0 || Size > 512+1 || Size < 1) {
33
14
        return 0;
34
14
    }
35
36
2.17k
    igraph_vector_int_init(&edges, Size-1);
37
163k
    for (size_t i=0; i < Size-1; ++i) {
38
160k
        VECTOR(edges)[i] = Data[i+1];
39
160k
    }
40
41
    /* Undirected */
42
2.17k
    if (igraph_create(&graph, &edges, Data[0], IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS) {
43
2.17k
        igraph_vector_int_list_t ivl1, ivl2;
44
2.17k
        igraph_vector_int_t iv1, iv2, iv3, iv4, iv5;
45
2.17k
        igraph_graph_list_t gl;
46
2.17k
        igraph_vector_bool_t bv;
47
2.17k
        igraph_matrix_t m;
48
2.17k
        igraph_int_t i, i2;
49
2.17k
        igraph_bool_t b, b2, loop, multi, graphical;
50
2.17k
        igraph_real_t r;
51
2.17k
        igraph_t g;
52
53
2.17k
        igraph_vector_int_list_init(&ivl1, 0);
54
2.17k
        igraph_vector_int_list_init(&ivl2, 0);
55
2.17k
        igraph_vector_int_init(&iv1, 0);
56
2.17k
        igraph_vector_int_init(&iv2, 0);
57
2.17k
        igraph_vector_int_init(&iv3, 0);
58
2.17k
        igraph_vector_int_init(&iv4, 0);
59
2.17k
        igraph_vector_int_init(&iv5, 0);
60
2.17k
        igraph_vector_bool_init(&bv, 0);
61
2.17k
        igraph_matrix_init(&m, 0, 0);
62
63
2.17k
        igraph_find_cycle(&graph, &iv1, &iv2, IGRAPH_ALL);
64
2.17k
        igraph_biconnected_components(&graph, &i, NULL, &ivl1, &ivl2, &iv1);
65
2.17k
        igraph_maximum_cardinality_search(&graph, &iv1, &iv2);
66
2.17k
        igraph_coreness(&graph, &iv1, IGRAPH_ALL);
67
2.17k
        igraph_girth(&graph, &r, &iv1);
68
2.17k
        igraph_bridges(&graph, &iv1);
69
2.17k
        igraph_assortativity_degree(&graph, &r, IGRAPH_UNDIRECTED);
70
2.17k
        igraph_count_multiple(&graph, &iv1, igraph_ess_all(IGRAPH_EDGEORDER_FROM));
71
2.17k
        igraph_is_loop(&graph, &bv, igraph_ess_all(IGRAPH_EDGEORDER_TO));
72
2.17k
        igraph_is_multiple(&graph, &bv, igraph_ess_all(IGRAPH_EDGEORDER_ID));
73
2.17k
        igraph_maxdegree(&graph, &i, igraph_vss_all(), IGRAPH_ALL, IGRAPH_LOOPS);
74
2.17k
        igraph_mean_degree(&graph, &r, IGRAPH_NO_LOOPS);
75
76
        /* Graphicality and graph realization based on the degrees of 'graph'. */
77
2.17k
        igraph_has_loop(&graph, &loop);
78
2.17k
        igraph_has_multiple(&graph, &multi);
79
2.17k
        igraph_degree(&graph, &iv1, igraph_vss_all(), IGRAPH_ALL, IGRAPH_LOOPS);
80
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_SIMPLE_SW, &b);
81
2.17k
        if (!loop && !multi) {
82
1.07k
            IGRAPH_ASSERT(b);
83
1.07k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
84
1.07k
            igraph_destroy(&g);
85
1.07k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
86
1.07k
            igraph_destroy(&g);
87
1.07k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
88
1.07k
            igraph_destroy(&g);
89
1.07k
        }
90
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_LOOPS_SW, &b);
91
2.17k
        if (!multi) {
92
1.35k
            IGRAPH_ASSERT(b);
93
            /* Undirected realization is not yet implemented. */
94
1.35k
        }
95
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_MULTI_SW, &b);
96
2.17k
        if (!loop) {
97
1.34k
            IGRAPH_ASSERT(b);
98
1.34k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
99
1.34k
            igraph_destroy(&g);
100
1.34k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
101
1.34k
            igraph_destroy(&g);
102
1.34k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
103
1.34k
            igraph_destroy(&g);
104
1.34k
        }
105
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, &b);
106
2.17k
        IGRAPH_ASSERT(b);
107
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
108
2.17k
        igraph_destroy(&g);
109
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
110
2.17k
        igraph_destroy(&g);
111
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
112
2.17k
        igraph_destroy(&g);
113
114
        /* Graphicality and graph realization based on the degrees of 'graph'. */
115
2.17k
        igraph_has_loop(&graph, &loop);
116
2.17k
        igraph_has_multiple(&graph, &multi);
117
2.17k
        igraph_degree(&graph, &iv1, igraph_vss_all(), IGRAPH_ALL, IGRAPH_LOOPS);
118
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_SIMPLE_SW, &graphical);
119
2.17k
        if (!loop && !multi) {
120
1.07k
            IGRAPH_ASSERT(graphical);
121
1.07k
        }
122
2.17k
        if (graphical) {
123
1.43k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
124
1.43k
            igraph_destroy(&g);
125
1.43k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
126
1.43k
            igraph_destroy(&g);
127
1.43k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
128
1.43k
            igraph_destroy(&g);
129
1.43k
        } else {
130
743
            CHECK_ERROR(
131
743
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST),
132
743
                IGRAPH_EINVAL);
133
743
            CHECK_ERROR(
134
743
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST),
135
743
                IGRAPH_EINVAL);
136
743
            CHECK_ERROR(
137
743
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_SIMPLE_SW, IGRAPH_REALIZE_DEGSEQ_INDEX),
138
743
                IGRAPH_EINVAL);
139
743
        }
140
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_LOOPS_SW, &graphical);
141
2.17k
        if (!multi) {
142
1.35k
            IGRAPH_ASSERT(graphical);
143
            /* Undirected realization is not yet implemented. */
144
1.35k
        }
145
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_MULTI_SW, &graphical);
146
2.17k
        if (!loop) {
147
1.34k
            IGRAPH_ASSERT(graphical);
148
1.34k
        }
149
2.17k
        if (graphical) {
150
1.78k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
151
1.78k
            igraph_destroy(&g);
152
1.78k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
153
1.78k
            igraph_destroy(&g);
154
1.78k
            igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
155
1.78k
            igraph_destroy(&g);
156
1.78k
        } else {
157
392
            CHECK_ERROR(
158
392
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST),
159
392
                IGRAPH_EINVAL);
160
392
            CHECK_ERROR(
161
392
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST),
162
392
                IGRAPH_EINVAL);
163
392
            CHECK_ERROR(
164
392
                igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_INDEX),
165
392
                IGRAPH_EINVAL);
166
392
        }
167
2.17k
        igraph_is_graphical(&iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, &graphical);
168
2.17k
        IGRAPH_ASSERT(graphical);
169
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_SMALLEST);
170
2.17k
        igraph_destroy(&g);
171
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_LARGEST);
172
2.17k
        igraph_destroy(&g);
173
2.17k
        igraph_realize_degree_sequence(&g, &iv1, NULL, IGRAPH_LOOPS_SW | IGRAPH_MULTI_SW, IGRAPH_REALIZE_DEGSEQ_INDEX);
174
2.17k
        igraph_destroy(&g);
175
176
        // These algorithms require a starting vertex,
177
        // so we require the graph to have at least one vertex.
178
2.17k
        if (igraph_vcount(&graph) >= 1) {
179
2.17k
            igraph_distances(&graph, NULL, &m, igraph_vss_1(0), igraph_vss_all(), IGRAPH_ALL);
180
2.17k
            igraph_get_shortest_paths(&graph, NULL, &ivl1, &ivl2, 0, igraph_vss_all(), IGRAPH_ALL, &iv1, &iv2);
181
2.17k
            igraph_pseudo_diameter(&graph, NULL, &r, 0, &i, &i2, false, true);
182
2.17k
            igraph_bfs(&graph, 0, NULL, IGRAPH_ALL, true, NULL, &iv1, &iv2, &iv3, &iv4, NULL, &iv5, NULL, NULL);
183
2.17k
            igraph_dfs(&graph, 0, IGRAPH_ALL, true, &iv1, &iv2, &iv3, &iv4, NULL, NULL, NULL);
184
2.17k
            igraph_bfs_simple(&graph, 0, IGRAPH_ALL, &iv1, &iv2, &iv3);
185
2.17k
            igraph_subcomponent(&graph, &iv1, 0, IGRAPH_ALL);
186
2.17k
            igraph_degree_1(&graph, &i, 0, IGRAPH_OUT, IGRAPH_LOOPS);
187
2.17k
            igraph_degree_1(&graph, &i, 0, IGRAPH_OUT, IGRAPH_NO_LOOPS);
188
2.17k
        }
189
190
2.17k
        if (igraph_vcount(&graph) >= 2) {
191
2.15k
            igraph_get_all_eids_between(&graph, &iv2, 1, 0, IGRAPH_UNDIRECTED);
192
2.15k
            igraph_get_all_eids_between(&graph, &iv2, 0, 0, IGRAPH_UNDIRECTED);
193
194
2.15k
            igraph_edges(&graph, igraph_ess_all(IGRAPH_EDGEORDER_FROM), &iv1, 0);
195
2.15k
            igraph_vector_int_push_back(&iv1, 0);
196
2.15k
            igraph_vector_int_push_back(&iv1, 1);
197
2.15k
            igraph_vector_int_push_back(&iv1, 1);
198
2.15k
            igraph_vector_int_push_back(&iv1, 1);
199
2.15k
            igraph_get_eids(&graph, &iv2, &iv1, IGRAPH_UNDIRECTED, false);
200
2.15k
        }
201
202
2.17k
        igraph_is_eulerian(&graph, &b, &b2);
203
2.17k
        if (b) igraph_eulerian_path(&graph, &iv1, &iv2);
204
2.17k
        if (b2) igraph_eulerian_cycle(&graph, &iv1, &iv2);
205
206
2.17k
        igraph_vertex_coloring_greedy(&graph, &iv1, IGRAPH_COLORING_GREEDY_COLORED_NEIGHBORS);
207
2.17k
        igraph_is_vertex_coloring(&graph, &iv1, &b);
208
2.17k
        IGRAPH_ASSERT(b);
209
2.17k
        igraph_vertex_coloring_greedy(&graph, &iv1, IGRAPH_COLORING_GREEDY_DSATUR);
210
2.17k
        igraph_is_vertex_coloring(&graph, &iv1, &b);
211
2.17k
        IGRAPH_ASSERT(b);
212
213
2.17k
        igraph_connected_components(&graph, &iv1, &iv2, &i, IGRAPH_WEAK);
214
2.17k
        igraph_minimum_spanning_tree(&graph, &iv1, NULL, IGRAPH_MST_UNWEIGHTED);
215
2.17k
        igraph_subgraph_from_edges(&graph, &g, igraph_ess_vector(&iv1), false);
216
2.17k
        if (i == 1 && igraph_vcount(&g) >= 2) {
217
            // 'g' is a tree (not a forest) when 'graph' had exactly one
218
            // connected component.
219
196
            igraph_to_prufer(&g, &iv1);
220
221
196
            igraph_t t;
222
196
            igraph_from_prufer(&t, &iv1);
223
196
            igraph_destroy(&t);
224
196
        }
225
2.17k
        igraph_destroy(&g);
226
227
2.17k
        if (igraph_vcount(&graph) >= 1) {
228
2.17k
            igraph_vector_int_resize(&iv1, 1);
229
2.17k
            VECTOR(iv1)[0] = 0;
230
2.17k
            igraph_unfold_tree(&graph, &g, IGRAPH_ALL, &iv1, &iv2);
231
2.17k
            igraph_destroy(&g);
232
2.17k
        }
233
234
2.17k
        igraph_graph_list_init(&gl, 0);
235
2.17k
        igraph_decompose(&graph, &gl, IGRAPH_WEAK, -1, 4);
236
2.17k
        igraph_graph_list_destroy(&gl);
237
238
2.17k
        igraph_simplify(&graph, true, true, NULL);
239
240
2.17k
        if (igraph_vcount(&graph) >=1) {
241
            // Run only on the simplified graph to avoid a very large number of
242
            // shortest paths due to multi-edges.
243
2.17k
            igraph_get_all_shortest_paths(&graph, NULL, &ivl1, &ivl2, &iv1, 0, igraph_vss_all(), IGRAPH_ALL);
244
2.17k
        }
245
246
        /* Basic graph modification */
247
2.17k
        igraph_add_vertices(&graph, 3, NULL);
248
2.17k
        igraph_degree_1(&graph, &i, 0, IGRAPH_ALL, IGRAPH_NO_LOOPS);
249
2.17k
        igraph_delete_vertices(&graph, igraph_vss_1(0));
250
2.17k
        igraph_add_edge(&graph, 0, 1);
251
2.17k
        igraph_count_multiple_1(&graph, &i, 0);
252
2.17k
        igraph_delete_edges(&graph, igraph_ess_1(0));
253
254
2.17k
        if (igraph_vcount(&graph) >= 4) {
255
2.15k
            igraph_rewire(&graph, igraph_ecount(&graph) + 1, IGRAPH_SIMPLE_SW, NULL);
256
2.15k
        }
257
258
2.17k
        igraph_matrix_destroy(&m);
259
2.17k
        igraph_vector_bool_destroy(&bv);
260
2.17k
        igraph_vector_int_destroy(&iv5);
261
2.17k
        igraph_vector_int_destroy(&iv4);
262
2.17k
        igraph_vector_int_destroy(&iv3);
263
2.17k
        igraph_vector_int_destroy(&iv2);
264
2.17k
        igraph_vector_int_destroy(&iv1);
265
2.17k
        igraph_vector_int_list_destroy(&ivl2);
266
2.17k
        igraph_vector_int_list_destroy(&ivl1);
267
268
2.17k
        igraph_destroy(&graph);
269
2.17k
    }
270
271
2.17k
    igraph_vector_int_destroy(&edges);
272
273
2.17k
    IGRAPH_ASSERT(IGRAPH_FINALLY_STACK_EMPTY);
274
275
2.17k
    return 0;  // Non-zero return values are reserved for future use.
276
2.17k
}