19#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
20#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
24#include <mcuxCsslAnalysis.h>
58#define MCUX_CSSL_FP_DECL_NAME(type, id) \
59 MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id)
70#define MCUX_CSSL_FP_DECL_IMPL(type, id) \
71 MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \
72 MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id)
81#define MCUX_CSSL_FP_ID_IMPL() \
82 MCUX_CSSL_CPP_CAT(__LINE__, u)
97#define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \
98 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
100 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
119#define MCUX_CSSL_FP_EXPECTATIONS(...) \
120 ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__)))
133#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \
134 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
135 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0))) \
136 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
147#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \
163#define MCUX_CSSL_FP_EXPECT_IMPL(...) \
165 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
184#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK
185 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \
208#define MCUX_CSSL_FP_FUNCTION_ID(id) \
209 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)
216#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \
226#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \
227 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)
236#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
237 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))
250#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \
261#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \
262 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))
274#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \
285#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \
301#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \
302 MCUX_CSSL_FP_FUNCTION_VALUE(id)
317#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \
318 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)
338#define MCUX_CSSL_FP_LOOP_ID(id) \
339 MCUX_CSSL_FP_ID_IMPL()
348#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \
349 MCUX_CSSL_FP_DECL_IMPL(LOOP, id)
359#define MCUX_CSSL_FP_LOOP_VALUE(id) \
360 MCUX_CSSL_FP_DECL_NAME(LOOP, id)
372#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \
373 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)
389#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \
390 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)
400#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \
401 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
402 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \
403 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
425#define MCUX_CSSL_FP_BRANCH_ID(id) \
426 MCUX_CSSL_FP_ID_IMPL()
435#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \
436 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)
446#define MCUX_CSSL_FP_BRANCH_VALUE(id) \
447 MCUX_CSSL_FP_DECL_NAME(BRANCH, id)
454#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u
461#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu
477#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \
478 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \
493#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \
494 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)
511#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \
512 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)
528#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \
529 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \
544#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \
545 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)
562#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \
563 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)
577#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \
578 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
579 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
580 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
581 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
595#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \
596 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)
609#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \
610 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
611 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
612 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
613 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \
614 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
615 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
616 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
631#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \
632 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)
646#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \
647 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)
660#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \
661 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
662 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
663 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
664 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \
665 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
666 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
667 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
682#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \
683 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)
705#define MCUX_CSSL_FP_SWITCH_ID(id) \
706 MCUX_CSSL_FP_ID_IMPL()
715#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \
716 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)
726#define MCUX_CSSL_FP_SWITCH_VALUE(id) \
727 MCUX_CSSL_FP_DECL_NAME(SWITCH, id)
740#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \
741 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)
758#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \
759 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)
766#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \
781#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \
782 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \
783 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)
795#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \
796 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u)
812#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \
813 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)
828#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \
829 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
830 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
831 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
832 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
845#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \
846 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
847 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
848 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
849 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \
850 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
851 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
852 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
869#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \
870 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)
883#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \
884 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)
896#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \
897 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
898 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
899 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
900 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \
901 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
902 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
903 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
918#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \
919 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)
The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.