Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: do not macro-expand failed assertion expressions

I've stumbled over the current macro-expand behaviour of the test
harness:

$ gcc -Wall -xc - <<'__EOF__'
TEST(macro) {
int status = 0;
ASSERT_TRUE(WIFSIGNALED(status));
}
TEST_HARNESS_MAIN
__EOF__
$ ./a.out
[==========] Running 1 tests from 1 test cases.
[ RUN ] global.macro
<stdin>:4:global.macro:Expected 0 (0) != (((signed char) (((status) & 0x7f) + 1) >> 1) > 0) (0)
global.macro: Test terminated by assertion
[ FAIL ] global.macro
[==========] 0 / 1 tests passed.
[ FAILED ]

With this change the output of the same test looks much more
comprehensible:

[==========] Running 1 tests from 1 test cases.
[ RUN ] global.macro
<stdin>:4:global.macro:Expected 0 (0) != WIFSIGNALED(status) (0)
global.macro: Test terminated by assertion
[ FAIL ] global.macro
[==========] 0 / 1 tests passed.
[ FAILED ]

The issue is very similar to the bug fixed in glibc assert(3)
three years ago:
https://sourceware.org/bugzilla/show_bug.cgi?id=18604

Cc: Shuah Khan <shuah@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Will Drewry <wad@chromium.org>
Cc: linux-kselftest@vger.kernel.org
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Acked-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Shuah Khan <shuah@kernel.org>

authored by

Dmitry V. Levin and committed by
Shuah Khan
b708a3cc 1d956785

+21 -21
+21 -21
tools/testing/selftests/kselftest_harness.h
··· 354 354 * ASSERT_EQ(expected, measured): expected == measured 355 355 */ 356 356 #define ASSERT_EQ(expected, seen) \ 357 - __EXPECT(expected, seen, ==, 1) 357 + __EXPECT(expected, #expected, seen, #seen, ==, 1) 358 358 359 359 /** 360 360 * ASSERT_NE(expected, seen) ··· 365 365 * ASSERT_NE(expected, measured): expected != measured 366 366 */ 367 367 #define ASSERT_NE(expected, seen) \ 368 - __EXPECT(expected, seen, !=, 1) 368 + __EXPECT(expected, #expected, seen, #seen, !=, 1) 369 369 370 370 /** 371 371 * ASSERT_LT(expected, seen) ··· 376 376 * ASSERT_LT(expected, measured): expected < measured 377 377 */ 378 378 #define ASSERT_LT(expected, seen) \ 379 - __EXPECT(expected, seen, <, 1) 379 + __EXPECT(expected, #expected, seen, #seen, <, 1) 380 380 381 381 /** 382 382 * ASSERT_LE(expected, seen) ··· 387 387 * ASSERT_LE(expected, measured): expected <= measured 388 388 */ 389 389 #define ASSERT_LE(expected, seen) \ 390 - __EXPECT(expected, seen, <=, 1) 390 + __EXPECT(expected, #expected, seen, #seen, <=, 1) 391 391 392 392 /** 393 393 * ASSERT_GT(expected, seen) ··· 398 398 * ASSERT_GT(expected, measured): expected > measured 399 399 */ 400 400 #define ASSERT_GT(expected, seen) \ 401 - __EXPECT(expected, seen, >, 1) 401 + __EXPECT(expected, #expected, seen, #seen, >, 1) 402 402 403 403 /** 404 404 * ASSERT_GE(expected, seen) ··· 409 409 * ASSERT_GE(expected, measured): expected >= measured 410 410 */ 411 411 #define ASSERT_GE(expected, seen) \ 412 - __EXPECT(expected, seen, >=, 1) 412 + __EXPECT(expected, #expected, seen, #seen, >=, 1) 413 413 414 414 /** 415 415 * ASSERT_NULL(seen) ··· 419 419 * ASSERT_NULL(measured): NULL == measured 420 420 */ 421 421 #define ASSERT_NULL(seen) \ 422 - __EXPECT(NULL, seen, ==, 1) 422 + __EXPECT(NULL, "NULL", seen, #seen, ==, 1) 423 423 424 424 /** 425 425 * ASSERT_TRUE(seen) ··· 429 429 * ASSERT_TRUE(measured): measured != 0 430 430 */ 431 431 #define ASSERT_TRUE(seen) \ 432 - ASSERT_NE(0, seen) 432 + __EXPECT(0, "0", seen, #seen, !=, 1) 433 433 434 434 /** 435 435 * ASSERT_FALSE(seen) ··· 439 439 * ASSERT_FALSE(measured): measured == 0 440 440 */ 441 441 #define ASSERT_FALSE(seen) \ 442 - ASSERT_EQ(0, seen) 442 + __EXPECT(0, "0", seen, #seen, ==, 1) 443 443 444 444 /** 445 445 * ASSERT_STREQ(expected, seen) ··· 472 472 * EXPECT_EQ(expected, measured): expected == measured 473 473 */ 474 474 #define EXPECT_EQ(expected, seen) \ 475 - __EXPECT(expected, seen, ==, 0) 475 + __EXPECT(expected, #expected, seen, #seen, ==, 0) 476 476 477 477 /** 478 478 * EXPECT_NE(expected, seen) ··· 483 483 * EXPECT_NE(expected, measured): expected != measured 484 484 */ 485 485 #define EXPECT_NE(expected, seen) \ 486 - __EXPECT(expected, seen, !=, 0) 486 + __EXPECT(expected, #expected, seen, #seen, !=, 0) 487 487 488 488 /** 489 489 * EXPECT_LT(expected, seen) ··· 494 494 * EXPECT_LT(expected, measured): expected < measured 495 495 */ 496 496 #define EXPECT_LT(expected, seen) \ 497 - __EXPECT(expected, seen, <, 0) 497 + __EXPECT(expected, #expected, seen, #seen, <, 0) 498 498 499 499 /** 500 500 * EXPECT_LE(expected, seen) ··· 505 505 * EXPECT_LE(expected, measured): expected <= measured 506 506 */ 507 507 #define EXPECT_LE(expected, seen) \ 508 - __EXPECT(expected, seen, <=, 0) 508 + __EXPECT(expected, #expected, seen, #seen, <=, 0) 509 509 510 510 /** 511 511 * EXPECT_GT(expected, seen) ··· 516 516 * EXPECT_GT(expected, measured): expected > measured 517 517 */ 518 518 #define EXPECT_GT(expected, seen) \ 519 - __EXPECT(expected, seen, >, 0) 519 + __EXPECT(expected, #expected, seen, #seen, >, 0) 520 520 521 521 /** 522 522 * EXPECT_GE(expected, seen) ··· 527 527 * EXPECT_GE(expected, measured): expected >= measured 528 528 */ 529 529 #define EXPECT_GE(expected, seen) \ 530 - __EXPECT(expected, seen, >=, 0) 530 + __EXPECT(expected, #expected, seen, #seen, >=, 0) 531 531 532 532 /** 533 533 * EXPECT_NULL(seen) ··· 537 537 * EXPECT_NULL(measured): NULL == measured 538 538 */ 539 539 #define EXPECT_NULL(seen) \ 540 - __EXPECT(NULL, seen, ==, 0) 540 + __EXPECT(NULL, "NULL", seen, #seen, ==, 0) 541 541 542 542 /** 543 543 * EXPECT_TRUE(seen) ··· 547 547 * EXPECT_TRUE(measured): 0 != measured 548 548 */ 549 549 #define EXPECT_TRUE(seen) \ 550 - EXPECT_NE(0, seen) 550 + __EXPECT(0, "0", seen, #seen, !=, 0) 551 551 552 552 /** 553 553 * EXPECT_FALSE(seen) ··· 557 557 * EXPECT_FALSE(measured): 0 == measured 558 558 */ 559 559 #define EXPECT_FALSE(seen) \ 560 - EXPECT_EQ(0, seen) 560 + __EXPECT(0, "0", seen, #seen, ==, 0) 561 561 562 562 /** 563 563 * EXPECT_STREQ(expected, seen) ··· 597 597 if (_metadata->passed && _metadata->step < 255) \ 598 598 _metadata->step++; 599 599 600 - #define __EXPECT(_expected, _seen, _t, _assert) do { \ 600 + #define __EXPECT(_expected, _expected_str, _seen, _seen_str, _t, _assert) do { \ 601 601 /* Avoid multiple evaluation of the cases */ \ 602 602 __typeof__(_expected) __exp = (_expected); \ 603 603 __typeof__(_seen) __seen = (_seen); \ ··· 606 606 unsigned long long __exp_print = (uintptr_t)__exp; \ 607 607 unsigned long long __seen_print = (uintptr_t)__seen; \ 608 608 __TH_LOG("Expected %s (%llu) %s %s (%llu)", \ 609 - #_expected, __exp_print, #_t, \ 610 - #_seen, __seen_print); \ 609 + _expected_str, __exp_print, #_t, \ 610 + _seen_str, __seen_print); \ 611 611 _metadata->passed = 0; \ 612 612 /* Ensure the optional handler is triggered */ \ 613 613 _metadata->trigger = 1; \