summaryrefslogtreecommitdiff
path: root/sci-libs/m4ri/files/m4ri-20200115-memory_violation.patch
blob: b74be3b4bf8fc867d1198913165cdc37cf6b6746 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
From e2fb0dcb70a97972fa1576a528cb01458f57a85d Mon Sep 17 00:00:00 2001
From: "Martin R. Albrecht" <martinralbrecht@googlemail.com>
Date: Sun, 19 Jan 2020 17:44:57 -0800
Subject: [PATCH] fix memory violation

fixes #72
---
 m4ri/mzd.c        |  2 +-
 tests/test_misc.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/m4ri/mzd.c b/m4ri/mzd.c
index 861905c..922dc3c 100644
--- a/m4ri/mzd.c
+++ b/m4ri/mzd.c
@@ -1894,7 +1894,7 @@ mzd_t *mzd_submatrix(mzd_t *S, mzd_t const *M, rci_t const startrow, rci_t const
   } else {
     wi_t j;
     for(rci_t i=0; i<nrows; i++) {
-      for(j=0; j+m4ri_radix<=ncols; j+=m4ri_radix)
+      for(j=0; j+m4ri_radix<ncols; j+=m4ri_radix)
         S->rows[i][j/m4ri_radix] = mzd_read_bits(M, startrow+i, startcol+j, m4ri_radix);
       S->rows[i][j/m4ri_radix] &= ~S->high_bitmask;
       S->rows[i][j/m4ri_radix] |= mzd_read_bits(M, startrow+i, startcol+j, ncols - j) & S->high_bitmask;
diff --git a/tests/test_misc.c b/tests/test_misc.c
index a9a9547..b1a2e32 100644
--- a/tests/test_misc.c
+++ b/tests/test_misc.c
@@ -76,6 +76,31 @@ int test_png(rci_t m, rci_t n) {
   return ret;
 }
 
+int test_submatrix(const rci_t m, const rci_t n, const rci_t lowr, const rci_t lowc, const rci_t highr, const rci_t highc) {
+  printf("submatrix: m: %4d, n: %4d, (%4d, %4d, %4d, %4d)", m, n, lowr, lowc, highr, highc);
+  assert(highr-lowr > 0);
+  assert(highc-lowc > 0);
+  mzd_t *M = mzd_init(m, n);
+  mzd_randomize(M);
+  mzd_t *S = mzd_init(highr-lowr, highc-lowc);
+  mzd_submatrix(S, M, lowr, lowc, highr, highc);
+  int ret = 0;
+  for(rci_t i=0; i<highr-lowr; i++) {
+    for(rci_t j=0; j<highc-lowc; j++) {
+      ret += (mzd_read_bit(M, lowr+i, lowc+j) ^ mzd_read_bit(S, i, j));
+    }
+  }
+
+  mzd_free(M);
+  mzd_free(S);
+
+  if(ret==0) {
+    printf(" ... passed\n");
+  } else {
+    printf(" ... FAILED\n");
+  }
+  return ret;
+}
 
 int main(int argc, char *argv[]) {
   int status = 0;
@@ -99,6 +124,23 @@ int main(int argc, char *argv[]) {
   status += test_png(126,12);
   status += test_png(128,200);
 
+  status += test_submatrix(2, 127, 1, 1, 2, 127);
+  status += test_submatrix(2, 128, 1, 1, 2, 128);
+  status += test_submatrix(2, 129, 1, 1, 2, 129);
+  status += test_submatrix(2, 130, 1, 1, 2, 130);
+  status += test_submatrix(2, 131, 1, 1, 2, 131);
+
+  status += test_submatrix(2, 63, 1, 1, 1, 63);
+  status += test_submatrix(2, 64, 1, 1, 1, 64);
+  status += test_submatrix(2, 65, 1, 1, 1, 65);
+  status += test_submatrix(2, 66, 1, 1, 1, 66);
+  status += test_submatrix(2, 67, 1, 1, 1, 67);
+
+  status += test_submatrix(2, 127, 1, 63, 2, 127);
+  status += test_submatrix(2, 128, 1, 64, 2, 128);
+  status += test_submatrix(2, 129, 1, 65, 2, 129);
+  status += test_submatrix(2, 130, 1, 66, 2, 130);
+
   if (!status) {
     printf("All tests passed.\n");
   } else {
-- 
2.10.5