Skip to content

Commit 4436c9f

Browse files
authored
Add bounds checking for BitOps.rotl and BitOps.rotr (#27814)
Adds bounds checking to prevent users calling BitOps.rotl and BitOps.rotr incorrectly This PR also expands the BitOps test cases significantly Resolves #27803 - [x] paratest
2 parents 5ec632d + cc6bb37 commit 4436c9f

22 files changed

+187
-3
lines changed

modules/internal/ChapelHashing.chpl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ module ChapelHashing {
8484
pragma "codegen for CPU and GPU"
8585
extern proc chpl_bitops_rotl_64(x: uint(64), n: uint(64)) : uint(64);
8686
var n:uint = (17 + fieldnum):uint;
87+
if boundsChecking {
88+
if n >= 64 {
89+
halt("rotation amount must be between 0 and 63 - got " + n:string);
90+
}
91+
}
8792
return _gen_key(a ^ chpl_bitops_rotl_64(b, n));
8893
}
8994

modules/standard/BitOps.chpl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,15 @@ private module BitOps_internal {
308308
}
309309

310310
inline proc rotl(x: uint(?bits), n: integral) {
311+
if boundsChecking {
312+
use HaltWrappers;
313+
if n < 0 || n >= bits {
314+
HaltWrappers.boundsCheckHalt("rotation amount must be between 0 and " +
315+
(bits-1):string +
316+
" for type of size " +
317+
bits:string + " - got " + n:string);
318+
}
319+
}
311320
// the select will be folded out at compile time.
312321
select bits {
313322
when 64 do
@@ -328,6 +337,15 @@ private module BitOps_internal {
328337
}
329338

330339
inline proc rotr(x: uint(?bits), n: integral) {
340+
if boundsChecking {
341+
use HaltWrappers;
342+
if n < 0 || n >= bits {
343+
HaltWrappers.boundsCheckHalt("rotation amount must be between 0 and " +
344+
(bits-1):string +
345+
" for type of size " +
346+
bits:string + " - got " + n:string);
347+
}
348+
}
331349
// the select will be folded out at compile time.
332350
select bits {
333351
when 64 do

test/library/standard/BitOps/clz.chpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ writeln(clz(x));
55
writeln(clz(x:uint(16)));
66
writeln(clz(x:uint(32)));
77
writeln(clz(x:uint(64)));
8+
writeln(clz(x:int(8)));
9+
writeln(clz(x:int(16)));
10+
writeln(clz(x:int(32)));
11+
writeln(clz(x:int(64)));

test/library/standard/BitOps/clz.good

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
12
33
28
44
60
5+
4
6+
12
7+
28
8+
60
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
use BitOps;
22

3-
var x: uint = 0x0004000000000000;
3+
var x: uint(64) = 0x0004000000000000;
44
writeln(ctz(x));
55
var x2: uint(32) = 0x00040000;
66
writeln(ctz(x2));
77
var x3: uint(16) = 0x0040;
88
writeln(ctz(x3));
99
var x4: uint(8) = 0x04;
1010
writeln(ctz(x4));
11+
12+
var x5: int(64) = 0x0004000000000000;
13+
writeln(ctz(x5));
14+
var x6: int(32) = 0x00040000;
15+
writeln(ctz(x6));
16+
var x7: int(16) = 0x0040;
17+
writeln(ctz(x7));
18+
var x8: int(8) = 0x04;
19+
writeln(ctz(x8));

test/library/standard/BitOps/ctz.good

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
18
33
6
44
2
5+
50
6+
18
7+
6
8+
2

test/library/standard/BitOps/parity.chpl

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use BitOps;
22

3-
var x: uint = 0xFF773311FF773311;
3+
var x: uint(64) = 0xFF773311FF773311;
44
writeln(parity(x));
55
x = 0xFF773311FF773313;
66
writeln(parity(x));
@@ -19,3 +19,25 @@ var x4: uint(8) = 0x0F;
1919
writeln(parity(x4));
2020
x4 = 0x1F;
2121
writeln(parity(x4));
22+
23+
var y: int(64) = -0x773311FF773311;
24+
writeln(parity(y));
25+
y = -0x773311FF773313;
26+
writeln(parity(y));
27+
28+
var y2: int(32) = -0x731F731;
29+
writeln(parity(y2));
30+
y2 = -0x731F733;
31+
writeln(parity(y2));
32+
33+
var y3: int(16) = -0x731;
34+
writeln(parity(y3));
35+
y3 = -0x733;
36+
writeln(parity(y3));
37+
38+
var y4: int(8) = -0x0F;
39+
writeln(parity(y4));
40+
y4 = -0x1F;
41+
writeln(parity(y4));
42+
43+

test/library/standard/BitOps/parity.good

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,11 @@
66
1
77
0
88
1
9+
1
10+
0
11+
1
12+
0
13+
1
14+
0
15+
1
16+
0
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
use BitOps;
22

3-
var x: uint = 0xFF773311FF773311;
3+
var x: uint(64) = 0xFF773311FF773311;
44
writeln(popCount(x));
55
var x2: uint(32) = 0xF731F731;
66
writeln(popCount(x2));
77
var x3: uint(16) = 0xF731;
88
writeln(popCount(x3));
99
var x4: uint(8) = 0xF1;
1010
writeln(popCount(x4));
11+
12+
var y: int(64) = 0x0F773311FF773311;
13+
writeln(popCount(y));
14+
var y2: int(32) = 0x0731F731;
15+
writeln(popCount(y2));
16+
var y3: int(16) = 0x0731;
17+
writeln(popCount(y3));
18+
var y4: int(8) = 0x71;
19+
writeln(popCount(y4));

test/library/standard/BitOps/popcount.good

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
20
33
10
44
5
5+
36
6+
16
7+
6
8+
4

0 commit comments

Comments
 (0)