Commit 416cf1f4 authored by Kees Cook's avatar Kees Cook
Browse files

kunit/fortify: Expand testing of __compiletime_strlen()

It seems that Clang thinks __builtin_constant_p() of undefined variables
should return true[1]. This is being fixed separately[2], but in the
meantime, expand the fortify tests to help track this kind of thing down
faster in the future.

Link: https://github.com/ClangBuiltLinux/linux/issues/2073 [1]
Link: https://github.com/llvm/llvm-project/pull/130713 [2]
Link: https://lore.kernel.org/r/20250312000349.work.786-kees@kernel.org


Signed-off-by: default avatarKees Cook <kees@kernel.org>
parent d985e439
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ static int fortify_write_overflows;

static const char array_of_10[] = "this is 10";
static const char *ptr_of_11 = "this is 11!";
static const char * const unchanging_12 = "this is 12!!";
static char array_unknown[] = "compiler thinks I might change";

void fortify_add_kunit_error(int write)
@@ -83,12 +84,28 @@ void fortify_add_kunit_error(int write)

static void fortify_test_known_sizes(struct kunit *test)
{
	char stack[80] = "Test!";

	KUNIT_EXPECT_FALSE(test, __is_constexpr(__builtin_strlen(stack)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(stack), 5);

	KUNIT_EXPECT_TRUE(test, __is_constexpr(__builtin_strlen("88888888")));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen("88888888"), 8);

	KUNIT_EXPECT_TRUE(test, __is_constexpr(__builtin_strlen(array_of_10)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(array_of_10), 10);

	KUNIT_EXPECT_FALSE(test, __is_constexpr(__builtin_strlen(ptr_of_11)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(ptr_of_11), 11);

	KUNIT_EXPECT_TRUE(test, __is_constexpr(__builtin_strlen(unchanging_12)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(unchanging_12), 12);

	KUNIT_EXPECT_FALSE(test, __is_constexpr(__builtin_strlen(array_unknown)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(array_unknown), SIZE_MAX);

	/* Externally defined and dynamically sized string pointer: */
	KUNIT_EXPECT_FALSE(test, __is_constexpr(__builtin_strlen(test->name)));
	KUNIT_EXPECT_EQ(test, __compiletime_strlen(test->name), SIZE_MAX);
}