diff options
| author | Paul Eggert | 2014-08-03 05:34:44 -0700 |
|---|---|---|
| committer | Paul Eggert | 2014-08-03 05:34:44 -0700 |
| commit | 8f88f7d3c5da38cd2d781770b533dc6c93c52d59 (patch) | |
| tree | a476fa662f618c23f55cfd5999425217f489de92 /src/scroll.c | |
| parent | 5fe16efb24c1b1a89959f7af3c886a4022c8f1b1 (diff) | |
| download | emacs-8f88f7d3c5da38cd2d781770b533dc6c93c52d59.tar.gz emacs-8f88f7d3c5da38cd2d781770b533dc6c93c52d59.zip | |
Avoid undefined behavior with signed left shift.
Caught by 'gcc -fsanitize=undefined'.
* dispextern.h, scroll.c (scrolling_max_lines_saved, scrolling_1):
* dispnew.c (line_hash_code, scrolling):
* scroll.c (calculate_scrolling, calculate_direct_scrolling):
Use 'unsigned', not 'int', for line hashes.
(scrolling_max_lines_saved): Avoid mystery constants for hash sizes.
Diffstat (limited to 'src/scroll.c')
| -rw-r--r-- | src/scroll.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/scroll.c b/src/scroll.c index 3da236ca8a6..6c559663f80 100644 --- a/src/scroll.c +++ b/src/scroll.c | |||
| @@ -90,7 +90,7 @@ calculate_scrolling (struct frame *frame, | |||
| 90 | /* matrix is of size window_size + 1 on each side. */ | 90 | /* matrix is of size window_size + 1 on each side. */ |
| 91 | struct matrix_elt *matrix, | 91 | struct matrix_elt *matrix, |
| 92 | int window_size, int lines_below, | 92 | int window_size, int lines_below, |
| 93 | int *draw_cost, int *old_hash, int *new_hash, | 93 | int *draw_cost, unsigned *old_hash, unsigned *new_hash, |
| 94 | int free_at_end) | 94 | int free_at_end) |
| 95 | { | 95 | { |
| 96 | register int i, j; | 96 | register int i, j; |
| @@ -427,7 +427,7 @@ calculate_direct_scrolling (struct frame *frame, | |||
| 427 | struct matrix_elt *matrix, | 427 | struct matrix_elt *matrix, |
| 428 | int window_size, int lines_below, | 428 | int window_size, int lines_below, |
| 429 | int *draw_cost, int *old_draw_cost, | 429 | int *draw_cost, int *old_draw_cost, |
| 430 | int *old_hash, int *new_hash, | 430 | unsigned *old_hash, unsigned *new_hash, |
| 431 | int free_at_end) | 431 | int free_at_end) |
| 432 | { | 432 | { |
| 433 | register int i, j; | 433 | register int i, j; |
| @@ -794,7 +794,7 @@ do_direct_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 794 | void | 794 | void |
| 795 | scrolling_1 (struct frame *frame, int window_size, int unchanged_at_top, | 795 | scrolling_1 (struct frame *frame, int window_size, int unchanged_at_top, |
| 796 | int unchanged_at_bottom, int *draw_cost, int *old_draw_cost, | 796 | int unchanged_at_bottom, int *draw_cost, int *old_draw_cost, |
| 797 | int *old_hash, int *new_hash, int free_at_end) | 797 | unsigned *old_hash, unsigned *new_hash, int free_at_end) |
| 798 | { | 798 | { |
| 799 | struct matrix_elt *matrix | 799 | struct matrix_elt *matrix |
| 800 | = alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix); | 800 | = alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix); |
| @@ -829,12 +829,14 @@ scrolling_1 (struct frame *frame, int window_size, int unchanged_at_top, | |||
| 829 | 829 | ||
| 830 | int | 830 | int |
| 831 | scrolling_max_lines_saved (int start, int end, | 831 | scrolling_max_lines_saved (int start, int end, |
| 832 | int *oldhash, int *newhash, | 832 | unsigned *oldhash, unsigned *newhash, |
| 833 | int *cost) | 833 | int *cost) |
| 834 | { | 834 | { |
| 835 | struct { int hash; int count; } lines[01000]; | 835 | enum { LOG2_NLINES = 9 }; |
| 836 | register int i, h; | 836 | enum { NLINES = 1 << LOG2_NLINES }; |
| 837 | register int matchcount = 0; | 837 | struct { unsigned hash; int count; } lines[NLINES]; |
| 838 | int i, h; | ||
| 839 | int matchcount = 0; | ||
| 838 | int avg_length = 0; | 840 | int avg_length = 0; |
| 839 | int threshold; | 841 | int threshold; |
| 840 | 842 | ||
| @@ -855,7 +857,7 @@ scrolling_max_lines_saved (int start, int end, | |||
| 855 | { | 857 | { |
| 856 | if (cost[i] > threshold) | 858 | if (cost[i] > threshold) |
| 857 | { | 859 | { |
| 858 | h = newhash[i] & 0777; | 860 | h = newhash[i] & (NLINES - 1); |
| 859 | lines[h].hash = newhash[i]; | 861 | lines[h].hash = newhash[i]; |
| 860 | lines[h].count++; | 862 | lines[h].count++; |
| 861 | } | 863 | } |
| @@ -865,7 +867,7 @@ scrolling_max_lines_saved (int start, int end, | |||
| 865 | matches between old lines and new. */ | 867 | matches between old lines and new. */ |
| 866 | for (i = start; i < end; i++) | 868 | for (i = start; i < end; i++) |
| 867 | { | 869 | { |
| 868 | h = oldhash[i] & 0777; | 870 | h = oldhash[i] & (NLINES - 1); |
| 869 | if (oldhash[i] == lines[h].hash) | 871 | if (oldhash[i] == lines[h].hash) |
| 870 | { | 872 | { |
| 871 | matchcount++; | 873 | matchcount++; |