From f5e0858d2f5eb9a59b3b4b76bc1b11dfb1cea107 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Thu, 16 Dec 2010 17:18:57 +0100 Subject: [PATCH] fix compiler warning: conversion may lose significant bits --- ares_nowarn.c | 41 ++++++++++++++++++++++++++++++++++++++++- ares_nowarn.h | 4 ++++ inet_net_pton.c | 15 ++++++++------- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/ares_nowarn.c b/ares_nowarn.c index ed84ade..5166222 100644 --- a/ares_nowarn.c +++ b/ares_nowarn.c @@ -34,7 +34,7 @@ #endif /* -** size_t to signed int +** unsigned size_t to signed int */ int aresx_uztosi(size_t uznum) @@ -62,9 +62,48 @@ int aresx_sltosi(long slnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif + DEBUGASSERT(slnum >= 0); return (int)(slnum & (long) CARES_MASK_SINT); #ifdef __INTEL_COMPILER # pragma warning(pop) #endif } + +/* +** signed ssize_t to signed int +*/ + +int aresx_sztosi(ssize_t sznum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + DEBUGASSERT(sznum >= 0); + return (int)(sznum & (ssize_t) CARES_MASK_SINT); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} + +/* +** signed ssize_t to unsigned int +*/ + +unsigned int aresx_sztoui(ssize_t sznum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + DEBUGASSERT(sznum >= 0); + return (unsigned int)(sznum & (ssize_t) CARES_MASK_UINT); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} diff --git a/ares_nowarn.h b/ares_nowarn.h index fb80495..6aa478f 100644 --- a/ares_nowarn.h +++ b/ares_nowarn.h @@ -21,4 +21,8 @@ int aresx_uztosi(size_t uznum); int aresx_sltosi(long slnum); +int aresx_sztosi(ssize_t sznum); + +unsigned int aresx_sztoui(ssize_t sznum); + #endif /* HEADER_CARES_NOWARN_H */ diff --git a/inet_net_pton.c b/inet_net_pton.c index 9bbe7aa..d701a9f 100644 --- a/inet_net_pton.c +++ b/inet_net_pton.c @@ -44,6 +44,7 @@ #include "ares.h" #include "ares_ipv6.h" +#include "ares_nowarn.h" #include "inet_net_pton.h" @@ -93,7 +94,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) { if (ISUPPER(ch)) ch = tolower(ch); - n = (int)(strchr(xdigits, ch) - xdigits); + n = aresx_sztosi(strchr(xdigits, ch) - xdigits); if (dirty == 0) tmp = n; else @@ -115,7 +116,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) for (;;) { tmp = 0; do { - n = (int)(strchr(digits, ch) - digits); + n = aresx_sztosi(strchr(digits, ch) - digits); tmp *= 10; tmp += n; if (tmp > 255) @@ -143,7 +144,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) ch = *src++; /* Skip over the /. */ bits = 0; do { - n = (int)(strchr(digits, ch) - digits); + n = aresx_sztosi(strchr(digits, ch) - digits); bits *= 10; bits += n; if (bits > 32) @@ -174,7 +175,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) bits = 8; /* If imputed mask is narrower than specified octets, widen. */ if (bits < ((dst - odst) * 8)) - bits = (int)(dst - odst) * 8; + bits = aresx_sztosi(dst - odst) * 8; /* * If there are no additional bits specified for a class D * address adjust bits to 4. @@ -217,7 +218,7 @@ getbits(const char *src, int *bitsp) if (n++ != 0 && val == 0) /* no leading zeros */ return (0); val *= 10; - val += (pch - digits); + val += aresx_sztosi(pch - digits); if (val > 128) /* range */ return (0); continue; @@ -249,7 +250,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp) if (n++ != 0 && val == 0) /* no leading zeros */ return (0); val *= 10; - val += (pch - digits); + val += aresx_sztoui(pch - digits); if (val > 255) /* range */ return (0); continue; @@ -309,7 +310,7 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) pch = strchr((xdigits = xdigits_u), ch); if (pch != NULL) { val <<= 4; - val |= (pch - xdigits); + val |= aresx_sztoui(pch - xdigits); if (++digits > 4) goto enoent; saw_xdigit = 1; -- 2.7.4