@@ -252,7 +252,8 @@ static int __init test_ ## t ## _overflow(void) { \
252
252
int err = 0; \
253
253
unsigned i; \
254
254
\
255
- pr_info("%-3s: %zu tests\n", #t, ARRAY_SIZE(t ## _tests)); \
255
+ pr_info("%-3s: %zu arithmetic tests\n", #t, \
256
+ ARRAY_SIZE(t ## _tests)); \
256
257
for (i = 0; i < ARRAY_SIZE(t ## _tests); ++i) \
257
258
err |= do_test_ ## t(&t ## _tests[i]); \
258
259
return err; \
@@ -287,6 +288,200 @@ static int __init test_overflow_calculation(void)
287
288
return err ;
288
289
}
289
290
291
+ static int __init test_overflow_shift (void )
292
+ {
293
+ int err = 0 ;
294
+
295
+ /* Args are: value, shift, type, expected result, overflow expected */
296
+ #define TEST_ONE_SHIFT (a , s , t , expect , of ) ({ \
297
+ int __failed = 0; \
298
+ typeof(a) __a = (a); \
299
+ typeof(s) __s = (s); \
300
+ t __e = (expect); \
301
+ t __d; \
302
+ bool __of = check_shl_overflow(__a, __s, &__d); \
303
+ if (__of != of) { \
304
+ pr_warn("expected (%s)(%s << %s) to%s overflow\n", \
305
+ #t, #a, #s, of ? "" : " not"); \
306
+ __failed = 1; \
307
+ } else if (!__of && __d != __e) { \
308
+ pr_warn("expected (%s)(%s << %s) == %s\n", \
309
+ #t, #a, #s, #expect); \
310
+ if ((t)-1 < 0) \
311
+ pr_warn("got %lld\n", (s64)__d); \
312
+ else \
313
+ pr_warn("got %llu\n", (u64)__d); \
314
+ __failed = 1; \
315
+ } \
316
+ if (!__failed) \
317
+ pr_info("ok: (%s)(%s << %s) == %s\n", #t, #a, #s, \
318
+ of ? "overflow" : #expect); \
319
+ __failed; \
320
+ })
321
+
322
+ /* Sane shifts. */
323
+ err |= TEST_ONE_SHIFT (1 , 0 , u8 , 1 << 0 , false);
324
+ err |= TEST_ONE_SHIFT (1 , 4 , u8 , 1 << 4 , false);
325
+ err |= TEST_ONE_SHIFT (1 , 7 , u8 , 1 << 7 , false);
326
+ err |= TEST_ONE_SHIFT (0xF , 4 , u8 , 0xF << 4 , false);
327
+ err |= TEST_ONE_SHIFT (1 , 0 , u16 , 1 << 0 , false);
328
+ err |= TEST_ONE_SHIFT (1 , 10 , u16 , 1 << 10 , false);
329
+ err |= TEST_ONE_SHIFT (1 , 15 , u16 , 1 << 15 , false);
330
+ err |= TEST_ONE_SHIFT (0xFF , 8 , u16 , 0xFF << 8 , false);
331
+ err |= TEST_ONE_SHIFT (1 , 0 , int , 1 << 0 , false);
332
+ err |= TEST_ONE_SHIFT (1 , 16 , int , 1 << 16 , false);
333
+ err |= TEST_ONE_SHIFT (1 , 30 , int , 1 << 30 , false);
334
+ err |= TEST_ONE_SHIFT (1 , 0 , s32 , 1 << 0 , false);
335
+ err |= TEST_ONE_SHIFT (1 , 16 , s32 , 1 << 16 , false);
336
+ err |= TEST_ONE_SHIFT (1 , 30 , s32 , 1 << 30 , false);
337
+ err |= TEST_ONE_SHIFT (1 , 0 , unsigned int , 1U << 0 , false);
338
+ err |= TEST_ONE_SHIFT (1 , 20 , unsigned int , 1U << 20 , false);
339
+ err |= TEST_ONE_SHIFT (1 , 31 , unsigned int , 1U << 31 , false);
340
+ err |= TEST_ONE_SHIFT (0xFFFFU , 16 , unsigned int , 0xFFFFU << 16 , false);
341
+ err |= TEST_ONE_SHIFT (1 , 0 , u32 , 1U << 0 , false);
342
+ err |= TEST_ONE_SHIFT (1 , 20 , u32 , 1U << 20 , false);
343
+ err |= TEST_ONE_SHIFT (1 , 31 , u32 , 1U << 31 , false);
344
+ err |= TEST_ONE_SHIFT (0xFFFFU , 16 , u32 , 0xFFFFU << 16 , false);
345
+ err |= TEST_ONE_SHIFT (1 , 0 , u64 , 1ULL << 0 , false);
346
+ err |= TEST_ONE_SHIFT (1 , 40 , u64 , 1ULL << 40 , false);
347
+ err |= TEST_ONE_SHIFT (1 , 63 , u64 , 1ULL << 63 , false);
348
+ err |= TEST_ONE_SHIFT (0xFFFFFFFFULL , 32 , u64 ,
349
+ 0xFFFFFFFFULL << 32 , false);
350
+
351
+ /* Sane shift: start and end with 0, without a too-wide shift. */
352
+ err |= TEST_ONE_SHIFT (0 , 7 , u8 , 0 , false);
353
+ err |= TEST_ONE_SHIFT (0 , 15 , u16 , 0 , false);
354
+ err |= TEST_ONE_SHIFT (0 , 31 , unsigned int , 0 , false);
355
+ err |= TEST_ONE_SHIFT (0 , 31 , u32 , 0 , false);
356
+ err |= TEST_ONE_SHIFT (0 , 63 , u64 , 0 , false);
357
+
358
+ /* Sane shift: start and end with 0, without reaching signed bit. */
359
+ err |= TEST_ONE_SHIFT (0 , 6 , s8 , 0 , false);
360
+ err |= TEST_ONE_SHIFT (0 , 14 , s16 , 0 , false);
361
+ err |= TEST_ONE_SHIFT (0 , 30 , int , 0 , false);
362
+ err |= TEST_ONE_SHIFT (0 , 30 , s32 , 0 , false);
363
+ err |= TEST_ONE_SHIFT (0 , 62 , s64 , 0 , false);
364
+
365
+ /* Overflow: shifted the bit off the end. */
366
+ err |= TEST_ONE_SHIFT (1 , 8 , u8 , 0 , true);
367
+ err |= TEST_ONE_SHIFT (1 , 16 , u16 , 0 , true);
368
+ err |= TEST_ONE_SHIFT (1 , 32 , unsigned int , 0 , true);
369
+ err |= TEST_ONE_SHIFT (1 , 32 , u32 , 0 , true);
370
+ err |= TEST_ONE_SHIFT (1 , 64 , u64 , 0 , true);
371
+
372
+ /* Overflow: shifted into the signed bit. */
373
+ err |= TEST_ONE_SHIFT (1 , 7 , s8 , 0 , true);
374
+ err |= TEST_ONE_SHIFT (1 , 15 , s16 , 0 , true);
375
+ err |= TEST_ONE_SHIFT (1 , 31 , int , 0 , true);
376
+ err |= TEST_ONE_SHIFT (1 , 31 , s32 , 0 , true);
377
+ err |= TEST_ONE_SHIFT (1 , 63 , s64 , 0 , true);
378
+
379
+ /* Overflow: high bit falls off unsigned types. */
380
+ /* 10010110 */
381
+ err |= TEST_ONE_SHIFT (150 , 1 , u8 , 0 , true);
382
+ /* 1000100010010110 */
383
+ err |= TEST_ONE_SHIFT (34966 , 1 , u16 , 0 , true);
384
+ /* 10000100000010001000100010010110 */
385
+ err |= TEST_ONE_SHIFT (2215151766U , 1 , u32 , 0 , true);
386
+ err |= TEST_ONE_SHIFT (2215151766U , 1 , unsigned int , 0 , true);
387
+ /* 1000001000010000010000000100000010000100000010001000100010010110 */
388
+ err |= TEST_ONE_SHIFT (9372061470395238550ULL , 1 , u64 , 0 , true);
389
+
390
+ /* Overflow: bit shifted into signed bit on signed types. */
391
+ /* 01001011 */
392
+ err |= TEST_ONE_SHIFT (75 , 1 , s8 , 0 , true);
393
+ /* 0100010001001011 */
394
+ err |= TEST_ONE_SHIFT (17483 , 1 , s16 , 0 , true);
395
+ /* 01000010000001000100010001001011 */
396
+ err |= TEST_ONE_SHIFT (1107575883 , 1 , s32 , 0 , true);
397
+ err |= TEST_ONE_SHIFT (1107575883 , 1 , int , 0 , true);
398
+ /* 0100000100001000001000000010000001000010000001000100010001001011 */
399
+ err |= TEST_ONE_SHIFT (4686030735197619275LL , 1 , s64 , 0 , true);
400
+
401
+ /* Overflow: bit shifted past signed bit on signed types. */
402
+ /* 01001011 */
403
+ err |= TEST_ONE_SHIFT (75 , 2 , s8 , 0 , true);
404
+ /* 0100010001001011 */
405
+ err |= TEST_ONE_SHIFT (17483 , 2 , s16 , 0 , true);
406
+ /* 01000010000001000100010001001011 */
407
+ err |= TEST_ONE_SHIFT (1107575883 , 2 , s32 , 0 , true);
408
+ err |= TEST_ONE_SHIFT (1107575883 , 2 , int , 0 , true);
409
+ /* 0100000100001000001000000010000001000010000001000100010001001011 */
410
+ err |= TEST_ONE_SHIFT (4686030735197619275LL , 2 , s64 , 0 , true);
411
+
412
+ /* Overflow: values larger than destination type. */
413
+ err |= TEST_ONE_SHIFT (0x100 , 0 , u8 , 0 , true);
414
+ err |= TEST_ONE_SHIFT (0xFF , 0 , s8 , 0 , true);
415
+ err |= TEST_ONE_SHIFT (0x10000U , 0 , u16 , 0 , true);
416
+ err |= TEST_ONE_SHIFT (0xFFFFU , 0 , s16 , 0 , true);
417
+ err |= TEST_ONE_SHIFT (0x100000000ULL , 0 , u32 , 0 , true);
418
+ err |= TEST_ONE_SHIFT (0x100000000ULL , 0 , unsigned int , 0 , true);
419
+ err |= TEST_ONE_SHIFT (0xFFFFFFFFUL , 0 , s32 , 0 , true);
420
+ err |= TEST_ONE_SHIFT (0xFFFFFFFFUL , 0 , int , 0 , true);
421
+ err |= TEST_ONE_SHIFT (0xFFFFFFFFFFFFFFFFULL , 0 , s64 , 0 , true);
422
+
423
+ /* Nonsense: negative initial value. */
424
+ err |= TEST_ONE_SHIFT (-1 , 0 , s8 , 0 , true);
425
+ err |= TEST_ONE_SHIFT (-1 , 0 , u8 , 0 , true);
426
+ err |= TEST_ONE_SHIFT (-5 , 0 , s16 , 0 , true);
427
+ err |= TEST_ONE_SHIFT (-5 , 0 , u16 , 0 , true);
428
+ err |= TEST_ONE_SHIFT (-10 , 0 , int , 0 , true);
429
+ err |= TEST_ONE_SHIFT (-10 , 0 , unsigned int , 0 , true);
430
+ err |= TEST_ONE_SHIFT (-100 , 0 , s32 , 0 , true);
431
+ err |= TEST_ONE_SHIFT (-100 , 0 , u32 , 0 , true);
432
+ err |= TEST_ONE_SHIFT (-10000 , 0 , s64 , 0 , true);
433
+ err |= TEST_ONE_SHIFT (-10000 , 0 , u64 , 0 , true);
434
+
435
+ /* Nonsense: negative shift values. */
436
+ err |= TEST_ONE_SHIFT (0 , -5 , s8 , 0 , true);
437
+ err |= TEST_ONE_SHIFT (0 , -5 , u8 , 0 , true);
438
+ err |= TEST_ONE_SHIFT (0 , -10 , s16 , 0 , true);
439
+ err |= TEST_ONE_SHIFT (0 , -10 , u16 , 0 , true);
440
+ err |= TEST_ONE_SHIFT (0 , -15 , int , 0 , true);
441
+ err |= TEST_ONE_SHIFT (0 , -15 , unsigned int , 0 , true);
442
+ err |= TEST_ONE_SHIFT (0 , -20 , s32 , 0 , true);
443
+ err |= TEST_ONE_SHIFT (0 , -20 , u32 , 0 , true);
444
+ err |= TEST_ONE_SHIFT (0 , -30 , s64 , 0 , true);
445
+ err |= TEST_ONE_SHIFT (0 , -30 , u64 , 0 , true);
446
+
447
+ /* Overflow: shifted at or beyond entire type's bit width. */
448
+ err |= TEST_ONE_SHIFT (0 , 8 , u8 , 0 , true);
449
+ err |= TEST_ONE_SHIFT (0 , 9 , u8 , 0 , true);
450
+ err |= TEST_ONE_SHIFT (0 , 8 , s8 , 0 , true);
451
+ err |= TEST_ONE_SHIFT (0 , 9 , s8 , 0 , true);
452
+ err |= TEST_ONE_SHIFT (0 , 16 , u16 , 0 , true);
453
+ err |= TEST_ONE_SHIFT (0 , 17 , u16 , 0 , true);
454
+ err |= TEST_ONE_SHIFT (0 , 16 , s16 , 0 , true);
455
+ err |= TEST_ONE_SHIFT (0 , 17 , s16 , 0 , true);
456
+ err |= TEST_ONE_SHIFT (0 , 32 , u32 , 0 , true);
457
+ err |= TEST_ONE_SHIFT (0 , 33 , u32 , 0 , true);
458
+ err |= TEST_ONE_SHIFT (0 , 32 , int , 0 , true);
459
+ err |= TEST_ONE_SHIFT (0 , 33 , int , 0 , true);
460
+ err |= TEST_ONE_SHIFT (0 , 32 , s32 , 0 , true);
461
+ err |= TEST_ONE_SHIFT (0 , 33 , s32 , 0 , true);
462
+ err |= TEST_ONE_SHIFT (0 , 64 , u64 , 0 , true);
463
+ err |= TEST_ONE_SHIFT (0 , 65 , u64 , 0 , true);
464
+ err |= TEST_ONE_SHIFT (0 , 64 , s64 , 0 , true);
465
+ err |= TEST_ONE_SHIFT (0 , 65 , s64 , 0 , true);
466
+
467
+ /*
468
+ * Corner case: for unsigned types, we fail when we've shifted
469
+ * through the entire width of bits. For signed types, we might
470
+ * want to match this behavior, but that would mean noticing if
471
+ * we shift through all but the signed bit, and this is not
472
+ * currently detected (but we'll notice an overflow into the
473
+ * signed bit). So, for now, we will test this condition but
474
+ * mark it as not expected to overflow.
475
+ */
476
+ err |= TEST_ONE_SHIFT (0 , 7 , s8 , 0 , false);
477
+ err |= TEST_ONE_SHIFT (0 , 15 , s16 , 0 , false);
478
+ err |= TEST_ONE_SHIFT (0 , 31 , int , 0 , false);
479
+ err |= TEST_ONE_SHIFT (0 , 31 , s32 , 0 , false);
480
+ err |= TEST_ONE_SHIFT (0 , 63 , s64 , 0 , false);
481
+
482
+ return err ;
483
+ }
484
+
290
485
/*
291
486
* Deal with the various forms of allocator arguments. See comments above
292
487
* the DEFINE_TEST_ALLOC() instances for mapping of the "bits".
@@ -397,6 +592,7 @@ static int __init test_module_init(void)
397
592
int err = 0 ;
398
593
399
594
err |= test_overflow_calculation ();
595
+ err |= test_overflow_shift ();
400
596
err |= test_overflow_allocation ();
401
597
402
598
if (err ) {
0 commit comments