Browse Source

lib: Changes to VTY string-parsing macros to remove warnings

The VTY_GET_INTEGER_RANGE macro was being used also just to check the range
on a variable that wasn't used (for the "no" version of a VTY command), so I
split the macro into two.  Also, since the variable is unsigned, if MIN is
zero, you get a warning about comparing an unsigned number against 0, giving
rise to slightly convoluted logic.  Note that the previous two patches were
found by the -Wtype-limits and -Wunused-variables warnings.  Without the
changes to these macros, these warnings are triggered erroneously, making it
harder to find the real problems.

Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com>
Andrew Certain 7 years ago
parent
commit
7798b6321c
1 changed files with 32 additions and 14 deletions
  1. 32 14
      lib/vty.h

+ 32 - 14
lib/vty.h

@@ -149,8 +149,8 @@ struct vty
 #define PRINTF_ATTRIBUTE(a,b)
 #endif /* __GNUC__ */
 
-/* Utility macros to convert VTY argument to unsigned long or integer. */
-#define VTY_GET_LONG(NAME,V,STR) \
+/* Utility macros to convert VTY argument to unsigned long */
+#define VTY_GET_ULONG(NAME,V,STR) \
 do { \
   char *endptr = NULL; \
   errno = 0; \
@@ -162,20 +162,38 @@ do { \
     } \
 } while (0)
 
-#define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX) \
-do { \
-  unsigned long tmpl; \
-  VTY_GET_LONG(NAME, tmpl, STR); \
-  if ( (tmpl < (MIN)) || (tmpl > (MAX))) \
-    { \
-      vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
-      return CMD_WARNING; \
-    } \
-  (V) = tmpl; \
+/*
+ * The logic below ((TMPL) <= ((MIN) && (TMPL) != (MIN)) is
+ * done to circumvent the compiler complaining about
+ * comparing unsigned numbers against zero, if MIN is zero.
+ * NB: The compiler isn't smart enough to supress the warning
+ * if you write (MIN) != 0 && tmpl < (MIN).
+ */
+#define VTY_GET_INTEGER_RANGE_HEART(NAME,TMPL,STR,MIN,MAX)      \
+do {                                                            \
+  VTY_GET_ULONG(NAME, (TMPL), STR);                             \
+  if ( ((TMPL) <= (MIN) && (TMPL) != (MIN)) || (TMPL) > (MAX) ) \
+    {                                                           \
+      vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE);\
+      return CMD_WARNING;                                       \
+    }                                                           \
+} while (0)
+
+#define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX)               \
+do {                                                            \
+  unsigned long tmpl;                                           \
+  VTY_GET_INTEGER_RANGE_HEART(NAME,tmpl,STR,MIN,MAX);           \
+  (V) = tmpl;                                                   \
+} while (0)
+
+#define VTY_CHECK_INTEGER_RANGE(NAME,STR,MIN,MAX)               \
+do {                                                            \
+  unsigned long tmpl;                                           \
+  VTY_GET_INTEGER_RANGE_HEART(NAME,tmpl,STR,MIN,MAX);           \
 } while (0)
 
-#define VTY_GET_INTEGER(NAME,V,STR) \
-  VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
+#define VTY_GET_INTEGER(NAME,V,STR)                             \
+    VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
 
 #define VTY_GET_IPV4_ADDRESS(NAME,V,STR)                                      \
 do {                                                                             \