Files
xen/docs/misra/safe.json
T
Volodymyr Babchuk be2a6a1096 xen: common: add ability to enable stack protector
Both GCC and Clang support -fstack-protector feature, which add stack
canaries to functions where stack corruption is possible. This patch
makes general preparations to enable this feature on different
supported architectures:

 - Added CONFIG_HAS_STACK_PROTECTOR option so each architecture
   can enable this feature individually
 - Added user-selectable CONFIG_STACK_PROTECTOR option
 - Implemented code that sets up random stack canary and a basic
   handler for stack protector failures

Stack guard value is initialized in two phases:

1. Pre-defined randomly-selected value.

2. Own implementation of linear congruent random number generator. It
relies on get_cycles() being available very early. If get_cycles()
returns zero, it would leave pre-defined value from the previous step.

boot_stack_chk_guard_setup() is declared as always_inline to ensure
that it will not trigger stack protector by itself. And of course,
caller should ensure that stack protection code will not be reached
later. It is possible to call the same function from an ASM code by
introducing simple trampoline in stack-protector.c, but right now
there is no use case for such trampoline.

As __stack_chk_fail() is not called by Xen source code directly, and
only called by compiler-generated code, it does not needed to be
declared separately. So we need separate MISRA deviation for it.

Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
2025-04-14 13:07:12 +02:00

125 lines
5.2 KiB
JSON

{
"version": "1.0",
"content": [
{
"id": "SAF-0-safe",
"analyser": {
"eclair": "MC3A2.R8.6",
"coverity": "misra_c_2012_rule_8_6_violation"
},
"name": "Rule 8.6: linker script defined symbols",
"text": "It is safe to declare this symbol because it is defined in the linker script."
},
{
"id": "SAF-1-safe",
"analyser": {
"eclair": "MC3A2.R8.4"
},
"name": "Rule 8.4: asm-only definition",
"text": "Functions and variables used only by asm modules do not need to have a visible declaration prior to their definition."
},
{
"id": "SAF-2-safe",
"analyser": {
"eclair": "MC3A2.R10.1"
},
"name": "MC3A2.R10.1: use of an enumeration constant in an arithmetic operation",
"text": "This violation can be fixed with a cast to (int) of the enumeration constant, but a deviation was chosen due to code readability (see also the comment in BITS_TO_LONGS)."
},
{
"id": "SAF-3-safe",
"analyser": {
"eclair": "MC3A2.R20.4"
},
"name": "MC3A2.R20.4: allow the definition of a macro with the same name as a keyword in some special cases",
"text": "The definition of a macro with the same name as a keyword can be useful in certain configurations to improve the guarantees that can be provided by Xen. See docs/misra/deviations.rst for a precise rationale for all such cases."
},
{
"id": "SAF-4-safe",
"analyser": {
"eclair": "MC3A2.R17.1"
},
"name": "Rule 17.1: internal helper functions made to break long running hypercalls into multiple calls.",
"text": "They need to take a variable number of arguments depending on the original hypercall they are trying to continue."
},
{
"id": "SAF-5-safe",
"analyser": {
"eclair": "MC3A2.R16.2"
},
"name": "MC3A2.R16.2: using a case label when the most closely-enclosing compound statement is not a switch statement",
"text": "A switch label enclosed by some compound statement that is not the body of a switch is permitted within local helper macros that are unlikely to be misused or misunderstood."
},
{
"id": "SAF-6-safe",
"analyser": {
"eclair": "MC3A2.R20.12"
},
"name": "MC3A2.R20.12: use of a macro argument that deliberately violates the Rule",
"text": "A macro parameter that is itself a macro is intentionally used within the macro both as a regular parameter and for text replacement."
},
{
"id": "SAF-7-safe",
"analyser": {
"eclair": "MC3A2.R20.7"
},
"name": "MC3A2.R20.7: deliberately non-parenthesized macro argument",
"text": "A macro parameter expands to an expression that is non-parenthesized, as doing so would break the functionality."
},
{
"id": "SAF-8-safe",
"analyser": {
"eclair": "MC3A2.D4.10"
},
"name": "Dir 4.10: headers that leave it up to the caller to include them correctly",
"text": "Headers that deliberatively leave the responsability of their correct inclusion to the caller are allowed."
},
{
"id": "SAF-9-safe",
"analyser": {
"eclair": "MC3A2.D4.10"
},
"name": "Dir 4.10: empty headers",
"text": "Empty headers pose no risk if included more than once."
},
{
"id": "SAF-10-safe",
"analyser": {
"eclair": "MC3A2.D4.10"
},
"name": "Dir 4.10: direct inclusion guard before",
"text": "Headers with just the direct inclusion guard before the inclusion guard are safe."
},
{
"id": "SAF-11-safe",
"analyser": {
"eclair": "MC3A2.R16.6"
},
"name": "Rule 16.6: single clause due to kconfig",
"text": "A switch statement with a single switch clause because other switch clauses are disabled in a given kconfig is safe."
},
{
"id": "SAF-12-safe",
"analyser": {
"eclair": "MC3A2.R16.6"
},
"name": "Rule 16.6: single clause due to future expansion",
"text": "A switch statement with a single switch clause to purposely enable future additions of new cases is safe."
},
{
"id": "SAF-13-safe",
"analyser": {
"eclair": "MC3A2.R8.4"
},
"name": "Rule 8.4: compiler-called function",
"text": "A function, all invocations of which are compiler generated, does not need to have a visible declaration prior to its definition."
},
{
"id": "SAF-14-safe",
"analyser": {},
"name": "Sentinel",
"text": "Next ID to be used"
}
]
}