mingw.c: Fix complier warnings for a 64 bit msvc
Remove some complier warnings from msvc in compat/mingw.c for value truncation from 64 bit to 32 bit integers. Compiling compat/mingw.c under a 64 bit version of msvc produces warnings. An "int" is 32 bit, and ssize_t or size_t should be 64 bit long. Prepare compat/vcbuild/include/unistd.h to have a 64 bit type _ssize_t, when _WIN64 is defined and 32 bit otherwise. Further down in this include file, as before, ssize_t is defined as _ssize_t, if needed. Use size_t instead of int for all variables that hold the result of strlen() or wcslen() (which cannot be negative). Use ssize_t to hold the return value of read(). Signed-off-by: Sören Krecker <soekkle@freenet.de> Signed-off-by: Taylor Blau <me@ttaylorr.com>
Sören Krecker committed
Oct 17, 2024 at 19:18 UTC
386d372031a76e508591090b09630e1af72c5c9d
3 files changed
+21
-12
compat/compiler.h
+2
-2
@@ -9,7 +9,7 @@
9
10
static inline void get_compiler_info(struct strbuf *info)
11
{
12
- int len = info->len;
12
+ size_t len = info->len;
13
#ifdef __clang__
14
strbuf_addf(info, "clang: %s\n", __clang_version__);
15
#elif defined(__GNUC__)
@@ -27,7 +27,7 @@ static inline void get_compiler_info(struct strbuf *info)
27
28
static inline void get_libc_info(struct strbuf *info)
29
{
30
- int len = info->len;
30
+ size_t len = info->len;
31
32
#ifdef __GLIBC__
33
strbuf_addf(info, "glibc: %s\n", gnu_get_libc_version());
compat/mingw.c
+15
-10
@@ -782,7 +782,7 @@ static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
782
*/
783
static int has_valid_directory_prefix(wchar_t *wfilename)
784
{
785
- int n = wcslen(wfilename);
785
+ size_t n = wcslen(wfilename);
786
787
while (n > 0) {
788
wchar_t c = wfilename[--n];
@@ -891,7 +891,7 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf)
891
*/
892
static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
893
{
894
- int namelen;
894
+ size_t namelen;
895
char alt_name[PATH_MAX];
896
897
if (!do_lstat(follow, file_name, buf))
@@ -1274,7 +1274,8 @@ static const char *parse_interpreter(const char *cmd)
1274
{
1275
static char buf[100];
1276
char *p, *opt;
1277
- int n, fd;
1277
+ ssize_t n; /* read() can return negative values */
1278
+ int fd;
1279
1280
/* don't even try a .exe */
1281
n = strlen(cmd);
@@ -1339,7 +1340,7 @@ static char *path_lookup(const char *cmd, int exe_only)
1340
{
1341
const char *path;
1342
char *prog = NULL;
1342
- int len = strlen(cmd);
1343
+ size_t len = strlen(cmd);
1344
int isexe = len >= 4 && !strcasecmp(cmd+len-4, ".exe");
1345
1346
if (strpbrk(cmd, "/\\"))
@@ -1956,7 +1957,7 @@ char *mingw_getenv(const char *name)
1957
#define GETENV_MAX_RETAIN 64
1958
static char *values[GETENV_MAX_RETAIN];
1959
static int value_counter;
1959
- int len_key, len_value;
1960
+ size_t len_key, len_value;
1961
wchar_t *w_key;
1962
char *value;
1963
wchar_t w_value[32768];
@@ -1968,7 +1969,8 @@ char *mingw_getenv(const char *name)
1969
/* We cannot use xcalloc() here because that uses getenv() itself */
1970
w_key = calloc(len_key, sizeof(wchar_t));
1971
if (!w_key)
1971
- die("Out of memory, (tried to allocate %u wchar_t's)", len_key);
1972
+ die("Out of memory, (tried to allocate %"PRIuMAX" wchar_t's)",
1973
+ (uintmax_t)len_key);
1974
xutftowcs(w_key, name, len_key);
1975
/* GetEnvironmentVariableW() only sets the last error upon failure */
1976
SetLastError(ERROR_SUCCESS);
@@ -1983,7 +1985,8 @@ char *mingw_getenv(const char *name)
1985
/* We cannot use xcalloc() here because that uses getenv() itself */
1986
value = calloc(len_value, sizeof(char));
1987
if (!value)
1986
- die("Out of memory, (tried to allocate %u bytes)", len_value);
1988
+ die("Out of memory, (tried to allocate %"PRIuMAX" bytes)",
1989
+ (uintmax_t)len_value);
1990
xwcstoutf(value, w_value, len_value);
1991
1992
/*
@@ -2001,7 +2004,7 @@ char *mingw_getenv(const char *name)
2004
2005
int mingw_putenv(const char *namevalue)
2006
{
2004
- int size;
2007
+ size_t size;
2008
wchar_t *wide, *equal;
2009
BOOL result;
2010
@@ -2011,7 +2014,8 @@ int mingw_putenv(const char *namevalue)
2014
size = strlen(namevalue) * 2 + 1;
2015
wide = calloc(size, sizeof(wchar_t));
2016
if (!wide)
2014
- die("Out of memory, (tried to allocate %u wchar_t's)", size);
2017
+ die("Out of memory, (tried to allocate %" PRIuMAX " wchar_t's)",
2018
+ (uintmax_t)size);
2019
xutftowcs(wide, namevalue, size);
2020
equal = wcschr(wide, L'=');
2021
if (!equal)
@@ -3085,7 +3089,8 @@ static void maybe_redirect_std_handles(void)
3089
*/
3090
int wmain(int argc, const wchar_t **wargv)
3091
{
3088
- int i, maxlen, exit_status;
3092
+ int i, exit_status;
3093
+ size_t maxlen;
3094
char *buffer, **save;
3095
const char **argv;
3096
compat/vcbuild/include/unistd.h
+4
@@ -14,7 +14,11 @@ typedef _mode_t mode_t;
14
15
#ifndef _SSIZE_T_
16
#define _SSIZE_T_
17
+#ifdef _WIN64
18
+typedef __int64 _ssize_t;
19
+#else
20
typedef long _ssize_t;
21
+#endif /* _WIN64 */
22
23
#ifndef _OFF_T_
24
#define _OFF_T_