Coverage Report

Created: 2026-09-01 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fuzz-headers/lang/c/ada_fuzz_header.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2021, Ada Logics Ltd. 
3
 * All rights reserverd. 
4
 * 
5
*/
6
7
#include <unistd.h>
8
9
// Simple garbage collector 
10
65.2k
#define GB_SIZE 100
11
12
void *pointer_arr[GB_SIZE];
13
static int pointer_idx = 0;
14
15
// If the garbage collector is used then this must be called as first thing
16
// during a fuzz run.
17
323
void af_gb_init() {
18
323
  pointer_idx = 0;
19
20
32.6k
   for (int i = 0; i < GB_SIZE; i++) {
21
32.3k
     pointer_arr[i] = NULL;
22
32.3k
   }
23
323
}
24
25
323
void af_gb_cleanup() {
26
32.6k
  for(int i = 0; i < GB_SIZE; i++) {
27
32.3k
    if (pointer_arr[i] != NULL) {
28
3.87k
      free(pointer_arr[i]);
29
3.87k
    }
30
32.3k
  }
31
323
}
32
33
3.87k
char *af_get_null_terminated(const uint8_t **data, size_t *size) {
34
17.2k
#define STR_SIZE 75
35
3.87k
  if (*size < STR_SIZE || (int)*size < 0) {
36
1.98k
    return NULL;
37
1.98k
  }
38
39
1.89k
  char *new_s = malloc(STR_SIZE + 1);
40
1.89k
  memcpy(new_s, *data, STR_SIZE);
41
1.89k
  new_s[STR_SIZE] = '\0';
42
43
1.89k
  *data = *data+STR_SIZE;
44
1.89k
  *size -= STR_SIZE;
45
1.89k
  return new_s;
46
3.87k
}
47
48
0
char *af_gb_get_random_data(const uint8_t **data, size_t *size, size_t to_get) {
49
0
  if (*size < to_get || (int)*size < 0) {
50
0
    return NULL;
51
0
  }
52
53
0
  char *new_s = malloc(to_get);
54
0
  memcpy(new_s, *data, to_get);
55
56
0
  pointer_arr[pointer_idx++] = (void*)new_s;
57
  
58
0
  *data = *data + to_get;
59
0
  *size -= to_get;
60
61
0
  return new_s;
62
0
}
63
64
3.87k
char *af_gb_get_null_terminated(const uint8_t **data, size_t *size) {
65
66
3.87k
  char *nstr = af_get_null_terminated(data, size);
67
3.87k
  if (nstr == NULL) {
68
1.98k
    return NULL;
69
1.98k
  }
70
1.89k
  pointer_arr[pointer_idx++] = (void*)nstr;
71
1.89k
  return nstr;
72
3.87k
}
73
74
0
char *af_gb_alloc_data(size_t len) {
75
0
  char *ptr = calloc(1, len);
76
0
  pointer_arr[pointer_idx++] = (void*)ptr;
77
  
78
0
  return ptr;
79
0
}
80
81
1.98k
char *af_gb_get_fixed_string() {
82
1.98k
  char *ptr = malloc(2);
83
1.98k
  ptr[0] = 'A';
84
1.98k
  ptr[1] = '\0';
85
1.98k
  pointer_arr[pointer_idx++] = (void*)ptr;
86
87
1.98k
  return ptr;
88
1.98k
}
89
90
0
short af_get_short(const uint8_t **data, size_t *size) {
91
0
  if (*size <= 0) return 0;
92
0
  short c = (short)(*data)[0];
93
0
  *data += 1;
94
0
  *size-=1;
95
0
  return c;
96
0
}
97
98
323
int af_get_int(const uint8_t **data, size_t *size) {
99
323
  if (*size <= 4) return 0;
100
70
  const uint8_t *ptr = *data;
101
70
  int val = *((int*)ptr);
102
70
  *data += 4;
103
70
  *size -= 4;
104
70
  return val;
105
323
}
106
107
108
// end simple garbage collector.
109
110
111
/* A-style */
112
const uint8_t *a_origin_data;
113
size_t a_size;
114
115
323
void af_safe_gb_init(const uint8_t *data, size_t size) {
116
323
  af_gb_init();
117
323
  a_origin_data = data;
118
323
  a_size = size;
119
323
}
120
121
323
int ada_safe_get_int() {
122
323
  return af_get_int(&a_origin_data, &a_size);
123
323
}
124
125
3.87k
char *ada_safe_get_char_p() {
126
3.87k
  char *tmps = af_gb_get_null_terminated(&a_origin_data, &a_size);
127
3.87k
  if (tmps != NULL) {
128
1.89k
    return tmps;
129
1.89k
  }
130
1.98k
  return af_gb_get_fixed_string();
131
3.87k
}
132
133
char *filename2 = NULL;
134
135
0
char *af_safe_write_random_file() {
136
0
  char *filename = malloc(10);
137
0
  filename[0] = '/';
138
0
  filename[1] = 't';
139
0
  filename[2] = 'm';
140
0
  filename[3] = 'p';
141
0
  filename[4] = '/';
142
0
  filename[5] = '1';
143
0
  filename[6] = '2';
144
0
  filename[7] = '.';
145
0
  filename[8] = 'a';
146
0
  filename[9] = '\0';
147
0
  filename2 = filename;
148
149
0
  FILE *fp = fopen(filename, "wb");
150
0
  char *content = ada_safe_get_char_p();
151
0
  fwrite(content, strlen(content), 1, fp);
152
0
  fclose(fp);
153
154
0
  return filename;
155
0
}
156
157
323
void af_safe_gb_cleanup() {
158
323
  af_gb_cleanup();
159
160
323
  if (filename2 != NULL) {
161
0
    unlink(filename2);
162
0
    free(filename2);
163
    filename2 = NULL;
164
0
  }
165
323
}