Commit 32ce1b48 authored by Amit Shah's avatar Amit Shah
Browse files

checker: ignore fields marked unused



While comparing qemu-1.0 json output with qemu-2.1, a few fields got
marked unused.  These need to be skipped over, and not flagged as
mismatches.

For handling unused fields, the exact number of bytes need to be skipped
over as the size of the unused field.

Currently, only the term "unused" is matched.  When more field names
turn up, this will have to be updated based on the whitelist matching
method to match more such terms.

Signed-off-by: default avatarAmit Shah <amit.shah@redhat.com>
parent bb9c3636
Loading
Loading
Loading
Loading
+50 −4
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ def check_fields(src_fields, dest_fields, desc, sec):

    advance_src = True
    advance_dest = True
    unused_count = 0

    while True:
        if advance_src:
@@ -156,6 +157,7 @@ def check_fields(src_fields, dest_fields, desc, sec):
                s_iter = s_iter_list.pop()
                continue
        else:
            if unused_count == 0:
                # We want to avoid advancing just once -- when entering a
                # dest substruct, or when exiting one.
                advance_src = True
@@ -177,8 +179,38 @@ def check_fields(src_fields, dest_fields, desc, sec):
                advance_src = False
                continue
        else:
            if unused_count == 0:
                advance_dest = True

        if unused_count > 0:
            if advance_dest == False:
                unused_count = unused_count - s_item["size"]
                if unused_count == 0:
                    advance_dest = True
                    continue
                if unused_count < 0:
                    print "Section \"" + sec + "\",",
                    print "Description \"" + desc + "\":",
                    print "unused size mismatch near \"",
                    print s_item["field"] + "\""
                    bump_taint()
                    break
                continue

            if advance_src == False:
                unused_count = unused_count - d_item["size"]
                if unused_count == 0:
                    advance_src = True
                    continue
                if unused_count < 0:
                    print "Section \"" + sec + "\",",
                    print "Description \"" + desc + "\":",
                    print "unused size mismatch near \"",
                    print d_item["field"] + "\""
                    bump_taint()
                    break
                continue

        if not check_fields_match(desc, s_item["field"], d_item["field"]):
            # Some fields were put in substructs, keeping the
            # on-wire format the same, but breaking static tools
@@ -208,6 +240,20 @@ def check_fields(src_fields, dest_fields, desc, sec):
                advance_dest = False
                continue

            if s_item["field"] == "unused" or d_item["field"] == "unused":
                if s_item["size"] == d_item["size"]:
                    continue

                if d_item["field"] == "unused":
                    advance_dest = False
                    unused_count = d_item["size"] - s_item["size"]
                    continue

                if s_item["field"] == "unused":
                    advance_src = False
                    unused_count = s_item["size"] - d_item["size"]
                    continue

            print "Section \"" + sec + "\",",
            print "Description \"" + desc + "\":",
            print "expected field \"" + s_item["field"] + "\",",