Commit f9a54755 authored by Krzysztof Chruściński's avatar Krzysztof Chruściński Committed by Carles Cufi
Browse files

sys: cbprintf: Add macro for validating strings for packaging



When cbprintf package is created statically then only argument
types are taken into account and not the format string. It means that a
character pointer is always interpreted as %s and not %p. When %s is
found then string from rw location is copied into the package.
Copying unexpected data may lead to memory faults so it must
be avoided. User shall cast an argument to a pointer of a different
type.

Patch adds macros which can at compile time determine if %p is
used with char *. Result cannot be passed to static assert because
compiler sees it as non-constant (even though calculated at compile
time) but a runtime logging error message can be added instead of
original message.

Z_CBPRINTF_NONE_CHAR_PTR_COUNT counts number of none character
pointers in the arguments list.
Z_CBPRINTF_P_COUNT counts number of %p occurrences in the format
string. If results of both macros are equal it means that string
is ok.

Signed-off-by: default avatarKrzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
parent 2a9f914d
Loading
Loading
Loading
Loading
+109 −0
Original line number Diff line number Diff line
@@ -139,6 +139,115 @@ static inline int z_cbprintf_cxx_is_word_num(T arg)
	_Pragma("GCC diagnostic pop")
}

/* C++ version for determining if argument is a none character pointer. */
static inline int z_cbprintf_cxx_is_none_char_ptr(char)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned char)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(short)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned short)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(int)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned int)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(long)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned long)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(long long)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned long long)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(float)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(double)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(volatile char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(const char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(const volatile char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(volatile unsigned char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(const unsigned char *)
{
	return 0;
}

static inline int z_cbprintf_cxx_is_none_char_ptr(const volatile unsigned char *)
{
	return 0;
}

template < typename T >
static inline int z_cbprintf_cxx_is_none_char_ptr(T arg)
{
	ARG_UNUSED(arg);

	return 1;
}

/* C++ version for calculating argument size. */
static inline size_t z_cbprintf_cxx_arg_size(float f)
{
+350 −0

File changed.

Preview size limit exceeded, changes collapsed.