commit 4861c9da86ada01cffa2ce3801f670587e896ce2 from: Neels Hofmeyr date: Fri Oct 30 03:55:03 2020 UTC add sanity assertions around adding result chunks uncovers errors related to placing minus chunks above already added plus chunks. commit - 6303eedc563848baa1f4c48ccdb70b80393255d6 commit + 4861c9da86ada01cffa2ce3801f670587e896ce2 blob - 1d0c6fd4faa11438034964c34bfb319969e36bff blob + 13fb82c4b8e75e74ec16e8b30fea6c29fd41efb3 --- lib/diff_main.c +++ lib/diff_main.c @@ -233,6 +233,14 @@ diff_state_add_solved_chunk(struct diff_state *state, debug_dump_atoms(&state->left, chunk->left_start, chunk->left_count); debug("R\n"); debug_dump_atoms(&state->right, chunk->right_start, chunk->right_count); + + if (result->len) { + last = &result->head[result->len - 1]; + assert(chunk->left_start + == last->left_start + last->left_count); + assert(chunk->right_start + == last->right_start + last->right_count); + } if (new_t == last_t) { new_chunk = &result->head[result->len - 1]; blob - c7749377c1c41c1fee60256db169cee8ece8fd9e blob + 3945cbb5448b10d07a96553307d4786990824929 --- lib/diff_output_unidiff.c +++ lib/diff_output_unidiff.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -397,6 +398,7 @@ diff_output_unidiff(struct diff_output_info **output_i result->right->root->diff_flags); bool show_function_prototypes = (flags & DIFF_FLAG_SHOW_PROTOTYPES); int i; + unsigned int check_left_pos, check_right_pos; if (!result) return EINVAL; @@ -420,6 +422,8 @@ diff_output_unidiff(struct diff_output_info **output_i } #if DEBUG + check_left_pos = 0; + check_right_pos = 0; for (i = 0; i < result->chunks.len; i++) { struct diff_chunk *c = &result->chunks.head[i]; enum diff_chunk_type t = diff_chunk_type(c); @@ -432,7 +436,14 @@ diff_output_unidiff(struct diff_output_info **output_i c->right_count, c->left_start ? diff_atom_root_idx(result->left, c->left_start) : -1, c->right_start ? diff_atom_root_idx(result->right, c->right_start) : -1); + assert(check_left_pos == diff_atom_root_idx(result->left, c->left_start)); + assert(check_right_pos == diff_atom_root_idx(result->right, c->right_start)); + check_left_pos += c->left_count; + check_right_pos += c->right_count; + } + assert(check_left_pos == result->left->atoms.len); + assert(check_right_pos == result->right->atoms.len); #endif for (i = 0; i < result->chunks.len; i++) {