|
| 1 | +# Exploring possibilities for integrating StrictDoc with ELISA’s requirements template approach for the Linux kernel |
| 2 | + |
| 3 | +This demonstrates how to realize the tool-agnostic |
| 4 | +[ELISA Kernel Requirements Template](https://docs.google.com/document/d/1c7S7YAledHP2EEQ2nh26Ibegij-XPNuUFkrFLtJPlzs/edit?tab=t.0) |
| 5 | +proposal by using [StrictDoc](https://strictdoc.readthedocs.io) as requirements processing tool. The repository contains a filtered (for brevity) |
| 6 | +copy of the Linux kernel with requirements and tests from Alessandro Carminat and Gabriele Paoloni ([^1], [^2]) applied on top. ELISA's |
| 7 | +[`SPDX-*` tagging scheme]((https://docs.google.com/document/d/1c7S7YAledHP2EEQ2nh26Ibegij-XPNuUFkrFLtJPlzs/edit?tab=t.0#heading=h.9dudo2y6dlhf)) |
| 8 | +was [added](https://github.com/strictdoc-project/linux-strictdoc/commit/9df9595b) along |
| 9 | +with a minimal StrictDoc project configuration. |
| 10 | + |
| 11 | +[^1]: https://lore.kernel.org/all/20250910170000.6475-1-gpaoloni@redhat.com/ |
| 12 | +[^2]: https://lore.kernel.org/linux-trace-kernel/20250814122206.109096-1-gpaoloni@redhat.com/#r |
| 13 | + |
| 14 | +Go to [rendered requirements](https://strictdoc-project.github.io/linux-strictdoc/). |
| 15 | + |
| 16 | +## Demonstrated features |
| 17 | + |
| 18 | +- Use `strictdoc export .` to generate a nice |
| 19 | + [static HTML document tree](https://strictdoc-project.github.io/linux-strictdoc/linux-strictdoc/Documentation/requirements/charmisc.html) |
| 20 | + with visual representation of the |
| 21 | + [traceability graph](https://strictdoc-project.github.io/linux-strictdoc/linux-strictdoc/Documentation/requirements/charmisc-TRACE.html#DOC-SUBSYS-CHARMISC), |
| 22 | + validation results and full-text search. Other output formats as e.g. PDF are available. |
| 23 | +- Compile and validate requirements |
| 24 | + [in CI](https://github.com/strictdoc-project/linux-strictdoc/blob/strictdoc/.github/workflows/ci.yaml). |
| 25 | +- Parses source code |
| 26 | + [SPDX-Req-* tags proposed by ELISA](https://docs.google.com/document/d/1c7S7YAledHP2EEQ2nh26Ibegij-XPNuUFkrFLtJPlzs/edit?tab=t.0#heading=h.9dudo2y6dlhf) |
| 27 | + and translates them to StrictDocs internal model. |
| 28 | +- Sidecar: Proposed by ELISA to hold additional requirement meta data outside source code. Realized as |
| 29 | + [separate sdoc file](https://github.com/strictdoc-project/linux-strictdoc/blob/strictdoc/Documentation/requirements/tracing.sdoc)s |
| 30 | + containing requirement stubs. Stubs are merged with source code tags by matching on `SPDX-Req-ID`. |
| 31 | +- Use `strictdoc manage auto-assign` to generate SPDX-Req-ID and SPDX-Req-HKey as suggested by Linux kernel |
| 32 | + requirements template. The hash generation method is `echo -nE "${PROJECT}${FILE_PATH}${INSTANCE}${CODE}" | sha256sum`. |
| 33 | + See [commit 86e7810d](https://github.com/strictdoc-project/linux-strictdoc/commit/86e7810d) |
| 34 | + for the auto-generated changes. |
| 35 | +- Tracing: Requirements, tests and functions become individual nodes in the traceability graph and are connected |
| 36 | + by their stable IDs. |
| 37 | +- Custom validations: Use plugin API to |
| 38 | + [provide a check](https://github.com/strictdoc-project/linux-strictdoc/blob/strictdoc/tools/requirements/validation_plugin.py#L28) |
| 39 | + to see if each requirement has at least one associated test, and each function expectations has at least one dedicated |
| 40 | + test. |
| 41 | +- Drift detection: As kernel development goes on, occasionally rerun `strictdoc manage auto-assign`. If `SPDX-Req-HKey` |
| 42 | + changes, this means that some semantic aspect of the requirement may have changed. |
| 43 | + |
| 44 | +For a thorough documentation of StrictDocs features see |
| 45 | +[StrictDoc User Guide ](https://strictdoc.readthedocs.io/en/stable/stable/docs/strictdoc_01_user_guide.html) |
| 46 | + |
| 47 | +## Tutorial: Add a Requirement |
| 48 | + |
| 49 | +### Install StrictDoc |
| 50 | +```sh |
| 51 | +pipx install strictdoc # note: requires strictdoc >= 0.15.1 |
| 52 | +git clone https://github.com/strictdoc-project/linux-strictdoc |
| 53 | +cd linux-strictdoc |
| 54 | +``` |
| 55 | + |
| 56 | +### Edit |
| 57 | + |
| 58 | +Add requirement statement and temporary identifier to source code comment |
| 59 | + |
| 60 | +`kernel/trace/trace_events.c` |
| 61 | +```c |
| 62 | +/* |
| 63 | + * SPDX-Req-ID: TMP-trace_events_enabled |
| 64 | + * SPDX-Req-Text: |
| 65 | + * This function shall check if there are enabled events in the provided list. |
| 66 | + * |
| 67 | + * Returns: |
| 68 | + * 0 : no events exist? |
| 69 | + * 1 : all events are disabled |
| 70 | + * 2 : all events are enabled |
| 71 | + * 3 : some events are enabled and some are enabled |
| 72 | + */ |
| 73 | +int trace_events_enabled(struct trace_array *tr, const char *system) |
| 74 | +``` |
| 75 | +
|
| 76 | +Add corresponding requirement stub in sidecar file |
| 77 | +
|
| 78 | +`Documentation/requirements/tracing.sdoc` |
| 79 | +``` |
| 80 | +[REQUIREMENT] |
| 81 | +MID: TMP-trace_events_enabled |
| 82 | +TITLE: trace_events_enabled |
| 83 | +``` |
| 84 | +
|
| 85 | +### Finish |
| 86 | +
|
| 87 | +Calculate stable identifier and hash value, will be replaced inline |
| 88 | +```sh |
| 89 | +strictdoc manage auto-uid . |
| 90 | +``` |
| 91 | + |
| 92 | +Verify new hash values were added and no existing requirement was changed |
| 93 | +```sh |
| 94 | +git diff |
| 95 | +``` |
| 96 | + |
| 97 | +```diff |
| 98 | +diff --git a/Documentation/requirements/tracing.sdoc b/Documentation/requirements/tracing.sdoc |
| 99 | +index 8d1dd2b5..2d86384a 100644 |
| 100 | +--- a/Documentation/requirements/tracing.sdoc |
| 101 | ++++ b/Documentation/requirements/tracing.sdoc |
| 102 | +@@ -22,6 +22,11 @@ TITLE: Event Tracing |
| 103 | + MID: 1ac497acf75d497f893006853f85fe86 |
| 104 | + TITLE: Requirements |
| 105 | + |
| 106 | ++[REQUIREMENT] |
| 107 | ++MID: b12884ce9b5b3258f1d28026c8aa1526f94030fd9f61ba583560f472015b1abb |
| 108 | ++HASH: 5949e5bf7ec43ed2c665d4ffe614dfaa285aafbe73a77df55aef0c099637f65b |
| 109 | ++TITLE: trace_events_enabled |
| 110 | ++ |
| 111 | + [REQUIREMENT] |
| 112 | + MID: 77958d2a51762caa727e5751d8dfec127c07cb5385f542d7b2fdf26b2a07c8b3 |
| 113 | + HASH: e8ee84ca42f5626ca9636abb53ded027708fdaabc99c8b935c016dda53130d81 |
| 114 | +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
| 115 | +index 16dabd1f..d07db4fa 100644 |
| 116 | +--- a/kernel/trace/trace_events.c |
| 117 | ++++ b/kernel/trace/trace_events.c |
| 118 | +@@ -2062,6 +2062,9 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, |
| 119 | + } |
| 120 | + |
| 121 | + /* |
| 122 | ++ * SPDX-Req-ID: b12884ce9b5b3258f1d28026c8aa1526f94030fd9f61ba583560f472015b1abb |
| 123 | ++ * SPDX-Req-Text: This function shall check if there are enabled events in the provided list. |
| 124 | ++ * |
| 125 | + * Returns: |
| 126 | + * 0 : no events exist? |
| 127 | + * 1 : all events are disabled |
| 128 | +``` |
| 129 | + |
| 130 | +Verify and validate |
| 131 | +```sh |
| 132 | +strictdoc export . |
| 133 | +``` |
| 134 | + |
| 135 | +### Send for Review |
| 136 | + |
| 137 | +```sh |
| 138 | +git add -u && git commit -m "docs: Add LLR for trace_events_enabled" |
| 139 | +git format-patch -n1 |
| 140 | +``` |
| 141 | + |
| 142 | +## Explanation of Content and Processing |
| 143 | + |
| 144 | +``` |
| 145 | +. |
| 146 | +├── Documentation |
| 147 | +│ └── requirements |
| 148 | +│ ├── charmisc.sdoc # sidecar |
| 149 | +│ └── tracing.sdoc # sidecar |
| 150 | +├── drivers |
| 151 | +│ └── char |
| 152 | +│ └── mem.c # Linux code with inlined LLRs |
| 153 | +├── kernel |
| 154 | +│ └── trace |
| 155 | +│ └── trace_events.c # Linux code with inlined LLRs |
| 156 | +├── strictdoc_config.py # StrictDoc project configuration |
| 157 | +└── tools |
| 158 | + ├── requirements |
| 159 | + │ └── validation_plugin.py # custom requirement validations |
| 160 | + └── testing |
| 161 | + └── selftests |
| 162 | + └── devmem |
| 163 | + └── tests.c # tests for /dev/mem LLRs |
| 164 | +``` |
| 165 | + |
| 166 | +StrictDoc performs the following notable process steps: |
| 167 | +- parse \*.sdoc files to create the initial traceability index (a DAG structure) |
| 168 | +- parse \*.c files using tree-sitter, read SPDX tags from it and merge it into the DAG |
| 169 | +- perform built-in validations and calculate built-in statistics |
| 170 | +- perform custom validations |
| 171 | + * check if all requirements have at least one related test |
| 172 | + * check if all function expectations are mentioned by one related test |
| 173 | +- render the DAG into a HTML document tree where all nodes are traceable, including |
| 174 | + requirements text, visual graph representation and source code view |
| 175 | + |
| 176 | +## Handling Fields with Special Meaning but Different Name in StrictDoc / ELISA |
| 177 | + |
| 178 | +The StrictDoc model assigns special meaning to some reserved field names: |
| 179 | +- `UID` Unique, human-readable. May change during requirement life-cycle. Used to refer to child/parents by default. |
| 180 | +- `MID`: Unique, not human-readable, stable. Optionally used to refer to child/parents. |
| 181 | + Supports changing the human-readable UID during the requirement life-cycle. |
| 182 | +- `HASH`: Hash sum over predefined requirement content. Can be auto-calculated. |
| 183 | +- `STATEMENT`: Some document views and import/export formats require to select a "most important" |
| 184 | + field from the many fields. |
| 185 | +- `COMMENT`: Can occur multiple times within one requirement. |
| 186 | + |
| 187 | +The ELISA requirements template defines similar special meaning for fields, but under different name. |
| 188 | +This is solved by two StrictDoc features: |
| 189 | +- `ProjectConfig(source_nodes=[SourceNodesEntry(sdoc_to_source_map={<sdoc_name>: <elisa_name>, ...})])` let's you define |
| 190 | + a mapping for fields that appearing under a different name in source code tags. |
| 191 | + Example: The stable ID appears as `SPDX-Req-ID` in source code comments, but must be named `MID` in sdoc. |
| 192 | +- Setting `HUMAN_TITLE` in the grammar lets you define a different display name for a field that has special |
| 193 | + StrictDoc meaning. Example: ELISA wants `HASH` to be named `SPDX-Req-HKey`. Since the field appears only in sdoc, |
| 194 | + but not in source code, it's enough to define `HUMAN_TITLE: SPDX-Req-HKey` for the `HASH` field. |
| 195 | + `sdoc_to_source_map` is not needed in this case. |
0 commit comments