]> granicus.if.org Git - zfs/commitdiff
Fix gcc -Warray-bounds check for dump_object() in zdb
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 1 Aug 2016 17:42:04 +0000 (17:42 +0000)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 2 Aug 2016 20:14:47 +0000 (13:14 -0700)
As of gcc 6.1.1 20160621 (Red Hat 6.1.1-3) an array bounds warnings
is detected in the zdb the dump_object() function.  The analysis is
correct but difficult to interpret because this is implemented as a
macro.  Rework the ZDB_OT_NAME in to a function and remove the case
detected by gcc which is a side effect of the DMU_OT_IS_VALID() macro.

  zdb.c: In function â€˜dump_object’:
  zdb.c:1931:288: error: array subscript is outside array bounds
      [-Werror=array-bounds]

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Gvozden Neskovic <neskovic@gmail.com>
Closes #4907

cmd/zdb/zdb.c

index e35d62cab9d1096a21398f946d45f0d438888f0c..b6ce9deb0c36fd5d2c2db24ffd1c611a6587d046 100644 (file)
        zio_compress_table[(idx)].ci_name : "UNKNOWN")
 #define        ZDB_CHECKSUM_NAME(idx) ((idx) < ZIO_CHECKSUM_FUNCTIONS ?        \
        zio_checksum_table[(idx)].ci_name : "UNKNOWN")
-#define        ZDB_OT_NAME(idx) ((idx) < DMU_OT_NUMTYPES ?     \
-       dmu_ot[(idx)].ot_name : DMU_OT_IS_VALID(idx) ?  \
-       dmu_ot_byteswap[DMU_OT_BYTESWAP(idx)].ob_name : "UNKNOWN")
 #define        ZDB_OT_TYPE(idx) ((idx) < DMU_OT_NUMTYPES ? (idx) :             \
        (((idx) == DMU_OTN_ZAP_DATA || (idx) == DMU_OTN_ZAP_METADATA) ? \
        DMU_OT_ZAP_OTHER : DMU_OT_NUMTYPES))
 
+static char *
+zdb_ot_name(dmu_object_type_t type)
+{
+       if (type < DMU_OT_NUMTYPES)
+               return (dmu_ot[type].ot_name);
+       else if ((type & DMU_OT_NEWTYPE) &&
+               ((type & DMU_OT_BYTESWAP_MASK) < DMU_BSWAP_NUMFUNCS))
+               return (dmu_ot_byteswap[type & DMU_OT_BYTESWAP_MASK].ob_name);
+       else
+               return ("UNKNOWN");
+}
+
 #ifndef lint
 extern int zfs_recover;
 extern uint64_t zfs_arc_max, zfs_arc_meta_limit;
@@ -1928,12 +1937,12 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
 
        (void) printf("%10lld  %3u  %5s  %5s  %5s  %6s  %5s  %6s  %s%s\n",
            (u_longlong_t)object, doi.doi_indirection, iblk, dblk,
-           asize, dnsize, lsize, fill, ZDB_OT_NAME(doi.doi_type), aux);
+           asize, dnsize, lsize, fill, zdb_ot_name(doi.doi_type), aux);
 
        if (doi.doi_bonus_type != DMU_OT_NONE && verbosity > 3) {
                (void) printf("%10s  %3s  %5s  %5s  %5s  %5s  %5s  %6s  %s\n",
                    "", "", "", "", "", "", bonus_size, "bonus",
-                   ZDB_OT_NAME(doi.doi_bonus_type));
+                   zdb_ot_name(doi.doi_bonus_type));
        }
 
        if (verbosity >= 4) {