Coverage Report

Created: 2026-01-17 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/str.h
Line
Count
Source
1
#ifndef STR_H
2
#define STR_H
3
4
#include "buffer.h"
5
6
string_t *str_new(pool_t pool, size_t initial_size);
7
string_t *t_str_new(size_t initial_size);
8
/* Allocate a constant string using the given str as the input data.
9
   str pointer is saved directly, so it must not be freed until the returned
10
   string is no longer used. len must contain strlen(str). */
11
string_t *str_new_const(pool_t pool, const char *str, size_t len);
12
string_t *t_str_new_const(const char *str, size_t len);
13
void str_free(string_t **str);
14
char *str_free_without_data(string_t **str);
15
16
const char *str_c(string_t *str);
17
char *str_c_modifiable(string_t *str);
18
bool str_equals(const string_t *str1, const string_t *str2) ATTR_PURE;
19
20
static inline const unsigned char *str_data(const string_t *str)
21
2.31M
{
22
2.31M
  return (const unsigned char*)str->data;
23
2.31M
}
message-decoder.c:str_data
Line
Count
Source
21
10.1k
{
22
10.1k
  return (const unsigned char*)str->data;
23
10.1k
}
Unexecuted instantiation: message-parser.c:str_data
Unexecuted instantiation: rfc2231-parser.c:str_data
Unexecuted instantiation: rfc822-parser.c:str_data
message-header-parser.c:str_data
Line
Count
Source
21
70.5k
{
22
70.5k
  return (const unsigned char*)str->data;
23
70.5k
}
Unexecuted instantiation: charset-utf8.c:str_data
Unexecuted instantiation: data-stack.c:str_data
Unexecuted instantiation: event-log.c:str_data
failures.c:str_data
Line
Count
Source
21
1
{
22
1
  return (const unsigned char*)str->data;
23
1
}
Unexecuted instantiation: iostream-pump.c:str_data
Unexecuted instantiation: istream.c:str_data
Unexecuted instantiation: lib-event.c:str_data
Unexecuted instantiation: path-util.c:str_data
Unexecuted instantiation: punycode.c:str_data
Unexecuted instantiation: restrict-access.c:str_data
str.c:str_data
Line
Count
Source
21
2.23M
{
22
2.23M
  return (const unsigned char*)str->data;
23
2.23M
}
Unexecuted instantiation: strescape.c:str_data
Unexecuted instantiation: strfuncs.c:str_data
Unexecuted instantiation: unichar.c:str_data
Unexecuted instantiation: backtrace-string.c:str_data
Unexecuted instantiation: event-filter.c:str_data
Unexecuted instantiation: event-filter-lexer.c:str_data
Unexecuted instantiation: wildcard-match.c:str_data
24
static inline size_t str_len(const string_t *str)
25
10.8M
{
26
10.8M
  return str->used;
27
10.8M
}
message-decoder.c:str_len
Line
Count
Source
25
12.4k
{
26
12.4k
  return str->used;
27
12.4k
}
Unexecuted instantiation: message-parser.c:str_len
rfc2231-parser.c:str_len
Line
Count
Source
25
16.6k
{
26
16.6k
  return str->used;
27
16.6k
}
rfc822-parser.c:str_len
Line
Count
Source
25
8.53M
{
26
8.53M
  return str->used;
27
8.53M
}
message-header-parser.c:str_len
Line
Count
Source
25
70.5k
{
26
70.5k
  return str->used;
27
70.5k
}
Unexecuted instantiation: charset-utf8.c:str_len
Unexecuted instantiation: data-stack.c:str_len
Unexecuted instantiation: event-log.c:str_len
failures.c:str_len
Line
Count
Source
25
2
{
26
2
  return str->used;
27
2
}
Unexecuted instantiation: iostream-pump.c:str_len
Unexecuted instantiation: istream.c:str_len
Unexecuted instantiation: lib-event.c:str_len
Unexecuted instantiation: path-util.c:str_len
Unexecuted instantiation: punycode.c:str_len
Unexecuted instantiation: restrict-access.c:str_len
str.c:str_len
Line
Count
Source
25
2.23M
{
26
2.23M
  return str->used;
27
2.23M
}
Unexecuted instantiation: strescape.c:str_len
Unexecuted instantiation: strfuncs.c:str_len
Unexecuted instantiation: unichar.c:str_len
Unexecuted instantiation: backtrace-string.c:str_len
Unexecuted instantiation: event-filter.c:str_len
Unexecuted instantiation: event-filter-lexer.c:str_len
Unexecuted instantiation: wildcard-match.c:str_len
28
29
/* Append NUL-terminated string. If the trailing NUL isn't found earlier,
30
   append a maximum of max_len characters. */
31
void str_append_max(string_t *str, const char *cstr, size_t max_len);
32
33
static inline void str_append(string_t *str, const char *cstr)
34
35.0M
{
35
35.0M
  buffer_append(str, cstr, strlen(cstr));
36
35.0M
}
Unexecuted instantiation: message-decoder.c:str_append
Unexecuted instantiation: message-parser.c:str_append
rfc2231-parser.c:str_append
Line
Count
Source
34
153k
{
35
153k
  buffer_append(str, cstr, strlen(cstr));
36
153k
}
rfc822-parser.c:str_append
Line
Count
Source
34
34.8M
{
35
34.8M
  buffer_append(str, cstr, strlen(cstr));
36
34.8M
}
Unexecuted instantiation: message-header-parser.c:str_append
Unexecuted instantiation: charset-utf8.c:str_append
Unexecuted instantiation: data-stack.c:str_append
Unexecuted instantiation: event-log.c:str_append
failures.c:str_append
Line
Count
Source
34
1
{
35
1
  buffer_append(str, cstr, strlen(cstr));
36
1
}
Unexecuted instantiation: iostream-pump.c:str_append
Unexecuted instantiation: istream.c:str_append
Unexecuted instantiation: lib-event.c:str_append
Unexecuted instantiation: path-util.c:str_append
Unexecuted instantiation: punycode.c:str_append
Unexecuted instantiation: restrict-access.c:str_append
Unexecuted instantiation: str.c:str_append
Unexecuted instantiation: strescape.c:str_append
Unexecuted instantiation: strfuncs.c:str_append
Unexecuted instantiation: unichar.c:str_append
Unexecuted instantiation: backtrace-string.c:str_append
Unexecuted instantiation: event-filter.c:str_append
Unexecuted instantiation: event-filter-lexer.c:str_append
Unexecuted instantiation: wildcard-match.c:str_append
37
static inline void str_append_data(string_t *str, const void *data, size_t len)
38
38.8M
{
39
38.8M
  buffer_append(str, data, len);
40
38.8M
}
Unexecuted instantiation: message-decoder.c:str_append_data
Unexecuted instantiation: message-parser.c:str_append_data
rfc2231-parser.c:str_append_data
Line
Count
Source
38
4.07k
{
39
4.07k
  buffer_append(str, data, len);
40
4.07k
}
rfc822-parser.c:str_append_data
Line
Count
Source
38
38.7M
{
39
38.7M
  buffer_append(str, data, len);
40
38.7M
}
message-header-parser.c:str_append_data
Line
Count
Source
38
70.5k
{
39
70.5k
  buffer_append(str, data, len);
40
70.5k
}
Unexecuted instantiation: charset-utf8.c:str_append_data
Unexecuted instantiation: data-stack.c:str_append_data
Unexecuted instantiation: event-log.c:str_append_data
Unexecuted instantiation: failures.c:str_append_data
Unexecuted instantiation: iostream-pump.c:str_append_data
Unexecuted instantiation: istream.c:str_append_data
Unexecuted instantiation: lib-event.c:str_append_data
Unexecuted instantiation: path-util.c:str_append_data
Unexecuted instantiation: punycode.c:str_append_data
Unexecuted instantiation: restrict-access.c:str_append_data
Unexecuted instantiation: str.c:str_append_data
Unexecuted instantiation: strescape.c:str_append_data
Unexecuted instantiation: strfuncs.c:str_append_data
Unexecuted instantiation: unichar.c:str_append_data
Unexecuted instantiation: backtrace-string.c:str_append_data
Unexecuted instantiation: event-filter.c:str_append_data
Unexecuted instantiation: event-filter-lexer.c:str_append_data
Unexecuted instantiation: wildcard-match.c:str_append_data
41
42
static inline void str_append_c(string_t *str, unsigned char chr)
43
385k
{
44
385k
  buffer_append_c(str, chr);
45
385k
}
Unexecuted instantiation: message-decoder.c:str_append_c
Unexecuted instantiation: message-parser.c:str_append_c
Unexecuted instantiation: rfc2231-parser.c:str_append_c
rfc822-parser.c:str_append_c
Line
Count
Source
43
314k
{
44
314k
  buffer_append_c(str, chr);
45
314k
}
message-header-parser.c:str_append_c
Line
Count
Source
43
70.5k
{
44
70.5k
  buffer_append_c(str, chr);
45
70.5k
}
Unexecuted instantiation: charset-utf8.c:str_append_c
Unexecuted instantiation: data-stack.c:str_append_c
Unexecuted instantiation: event-log.c:str_append_c
failures.c:str_append_c
Line
Count
Source
43
1
{
44
1
  buffer_append_c(str, chr);
45
1
}
Unexecuted instantiation: iostream-pump.c:str_append_c
Unexecuted instantiation: istream.c:str_append_c
Unexecuted instantiation: lib-event.c:str_append_c
Unexecuted instantiation: path-util.c:str_append_c
Unexecuted instantiation: punycode.c:str_append_c
Unexecuted instantiation: restrict-access.c:str_append_c
Unexecuted instantiation: str.c:str_append_c
Unexecuted instantiation: strescape.c:str_append_c
Unexecuted instantiation: strfuncs.c:str_append_c
Unexecuted instantiation: unichar.c:str_append_c
Unexecuted instantiation: backtrace-string.c:str_append_c
Unexecuted instantiation: event-filter.c:str_append_c
Unexecuted instantiation: event-filter-lexer.c:str_append_c
Unexecuted instantiation: wildcard-match.c:str_append_c
46
/* This macro ensures we add unsigned char to str to avoid
47
   implicit casts which cause errors with clang's implicit integer truncation
48
   sanitizer. Issues caught by these sanitizers are not undefined behavior,
49
   but are often unintentional.
50
   We also need to check that the type we are adding is compatible with char,
51
   so that we don't end up doing a narrowing cast. */
52
#ifdef HAVE_TYPE_CHECKS
53
#  define str_append_c(str, chr) \
54
385k
  str_append_c((str), __builtin_choose_expr( \
55
385k
    __builtin_types_compatible_p(typeof((chr)), char), \
56
385k
      (unsigned char)(chr), (chr)))
57
#endif
58
59
static inline void str_append_str(string_t *dest, const string_t *src)
60
0
{
61
0
  buffer_append(dest, src->data, src->used);
62
0
}
Unexecuted instantiation: message-decoder.c:str_append_str
Unexecuted instantiation: message-parser.c:str_append_str
Unexecuted instantiation: rfc2231-parser.c:str_append_str
Unexecuted instantiation: rfc822-parser.c:str_append_str
Unexecuted instantiation: message-header-parser.c:str_append_str
Unexecuted instantiation: charset-utf8.c:str_append_str
Unexecuted instantiation: data-stack.c:str_append_str
Unexecuted instantiation: event-log.c:str_append_str
Unexecuted instantiation: failures.c:str_append_str
Unexecuted instantiation: iostream-pump.c:str_append_str
Unexecuted instantiation: istream.c:str_append_str
Unexecuted instantiation: lib-event.c:str_append_str
Unexecuted instantiation: path-util.c:str_append_str
Unexecuted instantiation: punycode.c:str_append_str
Unexecuted instantiation: restrict-access.c:str_append_str
Unexecuted instantiation: str.c:str_append_str
Unexecuted instantiation: strescape.c:str_append_str
Unexecuted instantiation: strfuncs.c:str_append_str
Unexecuted instantiation: unichar.c:str_append_str
Unexecuted instantiation: backtrace-string.c:str_append_str
Unexecuted instantiation: event-filter.c:str_append_str
Unexecuted instantiation: event-filter-lexer.c:str_append_str
Unexecuted instantiation: wildcard-match.c:str_append_str
63
64
/* Append printf()-like data */
65
void str_printfa(string_t *str, const char *fmt, ...)
66
  ATTR_FORMAT(2, 3);
67
void str_vprintfa(string_t *str, const char *fmt, va_list args)
68
  ATTR_FORMAT(2, 0);
69
70
static inline void str_insert(string_t *str, size_t pos, const char *cstr)
71
0
{
72
0
  buffer_insert(str, pos, cstr, strlen(cstr));
73
0
}
Unexecuted instantiation: message-decoder.c:str_insert
Unexecuted instantiation: message-parser.c:str_insert
Unexecuted instantiation: rfc2231-parser.c:str_insert
Unexecuted instantiation: rfc822-parser.c:str_insert
Unexecuted instantiation: message-header-parser.c:str_insert
Unexecuted instantiation: charset-utf8.c:str_insert
Unexecuted instantiation: data-stack.c:str_insert
Unexecuted instantiation: event-log.c:str_insert
Unexecuted instantiation: failures.c:str_insert
Unexecuted instantiation: iostream-pump.c:str_insert
Unexecuted instantiation: istream.c:str_insert
Unexecuted instantiation: lib-event.c:str_insert
Unexecuted instantiation: path-util.c:str_insert
Unexecuted instantiation: punycode.c:str_insert
Unexecuted instantiation: restrict-access.c:str_insert
Unexecuted instantiation: str.c:str_insert
Unexecuted instantiation: strescape.c:str_insert
Unexecuted instantiation: strfuncs.c:str_insert
Unexecuted instantiation: unichar.c:str_insert
Unexecuted instantiation: backtrace-string.c:str_insert
Unexecuted instantiation: event-filter.c:str_insert
Unexecuted instantiation: event-filter-lexer.c:str_insert
Unexecuted instantiation: wildcard-match.c:str_insert
74
75
static inline void str_delete(string_t *str, size_t pos, size_t len)
76
0
{
77
0
  buffer_delete(str, pos, len);
78
0
}
Unexecuted instantiation: message-decoder.c:str_delete
Unexecuted instantiation: message-parser.c:str_delete
Unexecuted instantiation: rfc2231-parser.c:str_delete
Unexecuted instantiation: rfc822-parser.c:str_delete
Unexecuted instantiation: message-header-parser.c:str_delete
Unexecuted instantiation: charset-utf8.c:str_delete
Unexecuted instantiation: data-stack.c:str_delete
Unexecuted instantiation: event-log.c:str_delete
Unexecuted instantiation: failures.c:str_delete
Unexecuted instantiation: iostream-pump.c:str_delete
Unexecuted instantiation: istream.c:str_delete
Unexecuted instantiation: lib-event.c:str_delete
Unexecuted instantiation: path-util.c:str_delete
Unexecuted instantiation: punycode.c:str_delete
Unexecuted instantiation: restrict-access.c:str_delete
Unexecuted instantiation: str.c:str_delete
Unexecuted instantiation: strescape.c:str_delete
Unexecuted instantiation: strfuncs.c:str_delete
Unexecuted instantiation: unichar.c:str_delete
Unexecuted instantiation: backtrace-string.c:str_delete
Unexecuted instantiation: event-filter.c:str_delete
Unexecuted instantiation: event-filter-lexer.c:str_delete
Unexecuted instantiation: wildcard-match.c:str_delete
79
80
static inline void str_replace(string_t *str, size_t pos, size_t len,
81
             const char *cstr)
82
0
{
83
0
  buffer_replace(str, pos, len, cstr, strlen(cstr));
84
0
}
Unexecuted instantiation: message-decoder.c:str_replace
Unexecuted instantiation: message-parser.c:str_replace
Unexecuted instantiation: rfc2231-parser.c:str_replace
Unexecuted instantiation: rfc822-parser.c:str_replace
Unexecuted instantiation: message-header-parser.c:str_replace
Unexecuted instantiation: charset-utf8.c:str_replace
Unexecuted instantiation: data-stack.c:str_replace
Unexecuted instantiation: event-log.c:str_replace
Unexecuted instantiation: failures.c:str_replace
Unexecuted instantiation: iostream-pump.c:str_replace
Unexecuted instantiation: istream.c:str_replace
Unexecuted instantiation: lib-event.c:str_replace
Unexecuted instantiation: path-util.c:str_replace
Unexecuted instantiation: punycode.c:str_replace
Unexecuted instantiation: restrict-access.c:str_replace
Unexecuted instantiation: str.c:str_replace
Unexecuted instantiation: strescape.c:str_replace
Unexecuted instantiation: strfuncs.c:str_replace
Unexecuted instantiation: unichar.c:str_replace
Unexecuted instantiation: backtrace-string.c:str_replace
Unexecuted instantiation: event-filter.c:str_replace
Unexecuted instantiation: event-filter-lexer.c:str_replace
Unexecuted instantiation: wildcard-match.c:str_replace
85
86
/* Truncate the string to specified length. If it's already smaller,
87
   do nothing. */
88
static inline void str_truncate(string_t *str, size_t len)
89
8.62M
{
90
8.62M
  if (str_len(str) > len)
91
593k
    buffer_set_used_size(str, len);
92
8.62M
}
Unexecuted instantiation: message-decoder.c:str_truncate
Unexecuted instantiation: message-parser.c:str_truncate
rfc2231-parser.c:str_truncate
Line
Count
Source
89
16.6k
{
90
16.6k
  if (str_len(str) > len)
91
1.40k
    buffer_set_used_size(str, len);
92
16.6k
}
rfc822-parser.c:str_truncate
Line
Count
Source
89
8.53M
{
90
8.53M
  if (str_len(str) > len)
91
576k
    buffer_set_used_size(str, len);
92
8.53M
}
message-header-parser.c:str_truncate
Line
Count
Source
89
70.5k
{
90
70.5k
  if (str_len(str) > len)
91
15.9k
    buffer_set_used_size(str, len);
92
70.5k
}
Unexecuted instantiation: charset-utf8.c:str_truncate
Unexecuted instantiation: data-stack.c:str_truncate
Unexecuted instantiation: event-log.c:str_truncate
Unexecuted instantiation: failures.c:str_truncate
Unexecuted instantiation: iostream-pump.c:str_truncate
Unexecuted instantiation: istream.c:str_truncate
Unexecuted instantiation: lib-event.c:str_truncate
Unexecuted instantiation: path-util.c:str_truncate
Unexecuted instantiation: punycode.c:str_truncate
Unexecuted instantiation: restrict-access.c:str_truncate
Unexecuted instantiation: str.c:str_truncate
Unexecuted instantiation: strescape.c:str_truncate
Unexecuted instantiation: strfuncs.c:str_truncate
Unexecuted instantiation: unichar.c:str_truncate
Unexecuted instantiation: backtrace-string.c:str_truncate
Unexecuted instantiation: event-filter.c:str_truncate
Unexecuted instantiation: event-filter-lexer.c:str_truncate
Unexecuted instantiation: wildcard-match.c:str_truncate
93
94
/* Clear the string */
95
static inline void str_clear(string_t *str)
96
0
{
97
0
  buffer_clear(str);
98
0
}
Unexecuted instantiation: message-decoder.c:str_clear
Unexecuted instantiation: message-parser.c:str_clear
Unexecuted instantiation: rfc2231-parser.c:str_clear
Unexecuted instantiation: rfc822-parser.c:str_clear
Unexecuted instantiation: message-header-parser.c:str_clear
Unexecuted instantiation: charset-utf8.c:str_clear
Unexecuted instantiation: data-stack.c:str_clear
Unexecuted instantiation: event-log.c:str_clear
Unexecuted instantiation: failures.c:str_clear
Unexecuted instantiation: iostream-pump.c:str_clear
Unexecuted instantiation: istream.c:str_clear
Unexecuted instantiation: lib-event.c:str_clear
Unexecuted instantiation: path-util.c:str_clear
Unexecuted instantiation: punycode.c:str_clear
Unexecuted instantiation: restrict-access.c:str_clear
Unexecuted instantiation: str.c:str_clear
Unexecuted instantiation: strescape.c:str_clear
Unexecuted instantiation: strfuncs.c:str_clear
Unexecuted instantiation: unichar.c:str_clear
Unexecuted instantiation: backtrace-string.c:str_clear
Unexecuted instantiation: event-filter.c:str_clear
Unexecuted instantiation: event-filter-lexer.c:str_clear
Unexecuted instantiation: wildcard-match.c:str_clear
99
static inline void str_clear_safe(string_t *str)
100
0
{
101
0
  buffer_clear_safe(str);
102
0
}
Unexecuted instantiation: message-decoder.c:str_clear_safe
Unexecuted instantiation: message-parser.c:str_clear_safe
Unexecuted instantiation: rfc2231-parser.c:str_clear_safe
Unexecuted instantiation: rfc822-parser.c:str_clear_safe
Unexecuted instantiation: message-header-parser.c:str_clear_safe
Unexecuted instantiation: charset-utf8.c:str_clear_safe
Unexecuted instantiation: data-stack.c:str_clear_safe
Unexecuted instantiation: event-log.c:str_clear_safe
Unexecuted instantiation: failures.c:str_clear_safe
Unexecuted instantiation: iostream-pump.c:str_clear_safe
Unexecuted instantiation: istream.c:str_clear_safe
Unexecuted instantiation: lib-event.c:str_clear_safe
Unexecuted instantiation: path-util.c:str_clear_safe
Unexecuted instantiation: punycode.c:str_clear_safe
Unexecuted instantiation: restrict-access.c:str_clear_safe
Unexecuted instantiation: str.c:str_clear_safe
Unexecuted instantiation: strescape.c:str_clear_safe
Unexecuted instantiation: strfuncs.c:str_clear_safe
Unexecuted instantiation: unichar.c:str_clear_safe
Unexecuted instantiation: backtrace-string.c:str_clear_safe
Unexecuted instantiation: event-filter.c:str_clear_safe
Unexecuted instantiation: event-filter-lexer.c:str_clear_safe
Unexecuted instantiation: wildcard-match.c:str_clear_safe
103
104
/* Truncate the string to specified length, but also make sure the truncation
105
   doesn't happen in the middle of an UTF-8 character sequence. In that case,
106
   the string will end up being up to a few bytes smaller than len. If it's
107
   already smaller to begin with, do nothing. */
108
void str_truncate_utf8(string_t *str, size_t len);
109
110
#endif