/* Masks off 'val' bits from the IP contained within 'ip' */
inline int SfIp::cidr_mask(int val)
{
- uint32_t* p;
int index, bits;
- p = ip32;
-
if (val < 0 || val > 128)
return SFIP_ARG_ERR;
mask = ~0;
mask >>= bits;
mask <<= bits;
- p[index] &= htonl(mask);
+ ip32[index] &= htonl(mask);
}
index++;
/* 0 off the rest of the IP */
for (; index < 4; index++)
- p[index] = 0;
+ ip32[index] = 0;
return SFIP_SUCCESS;
}
#include "main/snort_types.h"
#include "sfip/sf_returns.h"
+#include "utils/cpp_macros.h"
namespace snort
{
}
/* Safe to ignore because ip32 is at the offset of 0 in SfIp */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+PACKED_MEMBER_ADDR_BEGIN
inline const uint32_t* SfIp::get_ip4_ptr() const
{
return ip32;
}
-#pragma GCC diagnostic pop
+PACKED_MEMBER_ADDR_END
inline bool SfIp::is_set() const
{
# define PADDING_GUARD_END
#endif
+// Pair of macros to temporarily disable and then enable warnings for code
+// that is accessing members of packed types with pointers
+#if defined(__clang__) && __clang_major__ >= 4 && !defined(__ICC)
+# define PACKED_MEMBER_ADDR_BEGIN \
+ _Pragma(STRINGIFY( clang diagnostic push )) \
+ _Pragma(STRINGIFY( clang diagnostic ignored "-Waddress-of-packed-member" ))
+# define PACKED_MEMBER_ADDR_END \
+ _Pragma(STRINGIFY( clang diagnostic pop ))
+#elif defined(__GNUC__) && __GNUC__ >= 9 && !defined(__ICC)
+# define PACKED_MEMBER_ADDR_BEGIN \
+ _Pragma(STRINGIFY( GCC diagnostic push )) \
+ _Pragma(STRINGIFY( GCC diagnostic ignored "-Waddress-of-packed-member" ))
+# define PACKED_MEMBER_ADDR_END \
+ _Pragma(STRINGIFY( GCC diagnostic pop ))
+#else
+# define PACKED_MEMBER_ADDR_BEGIN
+# define PACKED_MEMBER_ADDR_END
+#endif
+
#endif