Coverage Report

Created: 2026-09-14 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/curl/lib/curlx/warnless.c
Line
Count
Source
1
/***************************************************************************
2
 *                                  _   _ ____  _
3
 *  Project                     ___| | | |  _ \| |
4
 *                             / __| | | | |_) | |
5
 *                            | (__| |_| |  _ <| |___
6
 *                             \___|\___/|_| \_\_____|
7
 *
8
 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
9
 *
10
 * This software is licensed as described in the file COPYING, which
11
 * you should have received as part of this distribution. The terms
12
 * are also available at https://curl.se/docs/copyright.html.
13
 *
14
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15
 * copies of the Software, and permit persons to whom the Software is
16
 * furnished to do so, under the terms of the COPYING file.
17
 *
18
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
 * KIND, either express or implied.
20
 *
21
 * SPDX-License-Identifier: curl
22
 *
23
 ***************************************************************************/
24
#include "curl_setup.h"
25
26
#include "curlx/warnless.h"
27
28
#if defined(__INTEL_COMPILER) && defined(__unix__)
29
30
#ifdef HAVE_NETINET_IN_H
31
#include <netinet/in.h>
32
#endif
33
#ifdef HAVE_ARPA_INET_H
34
#include <arpa/inet.h>
35
#endif
36
37
#endif /* __INTEL_COMPILER && __unix__ */
38
39
0
#define CURL_MASK_UCHAR   ((unsigned char)~0)
40
41
68
#define CURL_MASK_USHORT  ((unsigned short)~0)
42
43
57.0k
#define CURL_MASK_UINT    ((unsigned int)~0)
44
47.8k
#define CURL_MASK_SINT    (CURL_MASK_UINT >> 1)
45
46
0
#define CURL_MASK_ULONG   ((unsigned long)~0)
47
48
3.02M
#define CURL_MASK_USIZE_T ((size_t)~0)
49
0
#define CURL_MASK_SSIZE_T (CURL_MASK_USIZE_T >> 1)
50
51
#ifdef __INTEL_COMPILER
52
#pragma warning(push)
53
#pragma warning(disable:810) /* conversion may lose significant bits */
54
#endif
55
56
/*
57
 * unsigned long to unsigned char
58
 */
59
unsigned char curlx_ultouc(unsigned long ulnum)
60
0
{
61
0
  DEBUGASSERT(ulnum <= (unsigned long)CURL_MASK_UCHAR);
62
0
  return (unsigned char)(ulnum & (unsigned long)CURL_MASK_UCHAR);
63
0
}
64
65
/*
66
 * unsigned size_t to signed int
67
 */
68
int curlx_uztosi(size_t uznum)
69
47.6k
{
70
47.6k
  DEBUGASSERT(uznum <= (size_t)CURL_MASK_SINT);
71
47.6k
  return (int)(uznum & (size_t)CURL_MASK_SINT);
72
47.6k
}
73
74
/*
75
 * unsigned size_t to unsigned long
76
 */
77
unsigned long curlx_uztoul(size_t uznum)
78
0
{
79
#if ULONG_MAX < SIZE_MAX
80
  DEBUGASSERT(uznum <= (size_t)CURL_MASK_ULONG);
81
#endif
82
0
  return (unsigned long)(uznum & (size_t)CURL_MASK_ULONG);
83
0
}
84
85
/*
86
 * unsigned size_t to unsigned int
87
 */
88
unsigned int curlx_uztoui(size_t uznum)
89
9.26k
{
90
9.26k
#if UINT_MAX < SIZE_MAX
91
9.26k
  DEBUGASSERT(uznum <= (size_t)CURL_MASK_UINT);
92
9.26k
#endif
93
9.26k
  return (unsigned int)(uznum & (size_t)CURL_MASK_UINT);
94
9.26k
}
95
96
/*
97
 * signed long to signed int
98
 */
99
int curlx_sltosi(long slnum)
100
159
{
101
159
  DEBUGASSERT(slnum >= 0);
102
159
#if INT_MAX < LONG_MAX
103
159
  DEBUGASSERT((unsigned long)slnum <= (unsigned long)CURL_MASK_SINT);
104
159
#endif
105
159
  return (int)(slnum & (long)CURL_MASK_SINT);
106
159
}
107
108
/*
109
 * signed long to unsigned int
110
 */
111
unsigned int curlx_sltoui(long slnum)
112
0
{
113
0
  DEBUGASSERT(slnum >= 0);
114
0
#if UINT_MAX < LONG_MAX
115
0
  DEBUGASSERT((unsigned long)slnum <= (unsigned long)CURL_MASK_UINT);
116
0
#endif
117
0
  return (unsigned int)(slnum & (long)CURL_MASK_UINT);
118
0
}
119
120
/*
121
 * signed long to unsigned short
122
 */
123
unsigned short curlx_sltous(long slnum)
124
68
{
125
68
  DEBUGASSERT(slnum >= 0);
126
68
  DEBUGASSERT((unsigned long)slnum <= (unsigned long)CURL_MASK_USHORT);
127
68
  return (unsigned short)(slnum & (long)CURL_MASK_USHORT);
128
68
}
129
130
/*
131
 * unsigned size_t to signed ssize_t
132
 */
133
ssize_t curlx_uztosz(size_t uznum)
134
0
{
135
0
  DEBUGASSERT(uznum <= (size_t)CURL_MASK_SSIZE_T);
136
0
  return (ssize_t)(uznum & (size_t)CURL_MASK_SSIZE_T);
137
0
}
138
139
/*
140
 * signed curl_off_t to unsigned size_t
141
 */
142
size_t curlx_sotouz(curl_off_t sonum)
143
3.02M
{
144
3.02M
  DEBUGASSERT(sonum >= 0);
145
3.02M
  return (size_t)(sonum & (curl_off_t)CURL_MASK_USIZE_T);
146
3.02M
}
147
148
/*
149
 * signed ssize_t to signed int
150
 */
151
int curlx_sztosi(ssize_t sznum)
152
0
{
153
0
  DEBUGASSERT(sznum >= 0);
154
0
#if INT_MAX < SSIZE_MAX
155
0
  DEBUGASSERT((size_t)sznum <= (size_t)CURL_MASK_SINT);
156
0
#endif
157
0
  return (int)(sznum & (ssize_t)CURL_MASK_SINT);
158
0
}
159
160
/*
161
 * unsigned int to unsigned short
162
 */
163
unsigned short curlx_uitous(unsigned int uinum)
164
0
{
165
0
  DEBUGASSERT(uinum <= (unsigned int)CURL_MASK_USHORT);
166
0
  return (unsigned short)(uinum & (unsigned int)CURL_MASK_USHORT);
167
0
}
168
169
/*
170
 * signed int to unsigned size_t
171
 */
172
size_t curlx_sitouz(int sinum)
173
0
{
174
0
  DEBUGASSERT(sinum >= 0);
175
0
  return (size_t)sinum;
176
0
}
177
178
#ifdef __INTEL_COMPILER
179
#pragma warning(pop)
180
#endif
181
182
size_t curlx_uitouz(unsigned int uinum)
183
50.7k
{
184
50.7k
  return (size_t)uinum;
185
50.7k
}
186
187
size_t curlx_sotouz_range(curl_off_t sonum, size_t uzmin, size_t uzmax)
188
3.61k
{
189
3.61k
  if(sonum < 0)
190
0
    return uzmin;
191
#if SIZEOF_CURL_OFF_T > SIZEOF_SIZE_T
192
  if(sonum > SIZE_MAX)
193
    return uzmax;
194
#endif
195
3.61k
  return CURLMIN(CURLMAX((size_t)sonum, uzmin), uzmax);
196
3.61k
}
197
198
bool curlx_sztouz(ssize_t sznum, size_t *puznum)
199
549k
{
200
549k
  if(sznum < 0) {
201
6.93k
    *puznum = 0;
202
6.93k
    return FALSE;
203
6.93k
  }
204
542k
  *puznum = (size_t)sznum;
205
542k
  return TRUE;
206
549k
}
207
208
bool curlx_sotouz_fits(curl_off_t sonum, size_t *puznum)
209
0
{
210
0
  if(sonum < 0) {
211
0
    *puznum = 0;
212
0
    return FALSE;
213
0
  }
214
#if SIZEOF_CURL_OFF_T > SIZEOF_SIZE_T
215
  if(sonum > SIZE_MAX) {
216
    *puznum = 0;
217
    return FALSE;
218
  }
219
#endif
220
0
  *puznum = (size_t)sonum;
221
0
  return TRUE;
222
0
}
223
224
bool curlx_sltouz(long slnum, size_t *puznum)
225
0
{
226
0
  if(slnum < 0) {
227
0
    *puznum = 0;
228
0
    return FALSE;
229
0
  }
230
  /* We error in curl_setup.h if SIZEOF_LONG > SIZEOF_SIZE_T */
231
0
  *puznum = (size_t)slnum;
232
0
  return TRUE;
233
0
}
234
235
curl_off_t curlx_uztoso(size_t uznum)
236
0
{
237
0
#if SIZEOF_SIZE_T >= SIZEOF_CURL_OFF_T
238
0
  if(uznum > (size_t)CURL_OFF_T_MAX)
239
0
    return CURL_OFF_T_MAX;
240
0
#endif
241
0
  return (curl_off_t)uznum;
242
0
}