diff --git a/.fusa-reqs.json b/.fusa-reqs.json index 68054a3..52458b2 100644 --- a/.fusa-reqs.json +++ b/.fusa-reqs.json @@ -169,6 +169,163 @@ {"id":"REQ-FUSA005","title":"engine rule FUSA005 fires when no CI configuration is present, and is silent with GitHub Actions or GitLab CI config","standard":"c-FuSa engine","level":"ASIL-A"}, {"id":"REQ-RPTCORE001","title":"cfusa_report_t lifecycle: init/add/free, compliance score decreases with error/warning findings, severity-to-string, format-string parsing, JSON/SARIF rendering, and deterministic per-finding fingerprints","standard":"c-FuSa core","level":"ASIL-A"}, {"id":"REQ-CFGCORE001","title":"cfusa_config_t defaults (project/version/limits/standards/excludes/extensions), save/load round-trip, exclude-pattern matching, and fallback to defaults when the config file is missing","standard":"c-FuSa core","level":"ASIL-A"}, - {"id":"REQ-UTILCORE001","title":"c-FuSa shared utility primitives: SHA-256 and HMAC-SHA256 known-answer vectors, string helpers (contains/starts-with/trim/escape-json), and path helpers (basename/extension/join)","standard":"c-FuSa core","level":"ASIL-A"} + {"id":"REQ-UTILCORE001","title":"c-FuSa shared utility primitives: SHA-256 and HMAC-SHA256 known-answer vectors, string helpers (contains/starts-with/trim/escape-json), and path helpers (basename/extension/join)","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-ANA003","title":"A003 detects a signed/unsigned comparison","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA004","title":"A004 detects integer overflow risk (INT_MAX/UINT_MAX used without a bounds check)","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA005","title":"A005 detects use of assert() in production code (not for safety invariants in release builds)","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA006","title":"A006 detects pointer arithmetic (MISRA-C Rule 18.4)","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA007","title":"A007 detects a missing return-value check for a system call","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA008","title":"A006 pointer-arithmetic detection regression-covered by the legacy test_analyze_rules.c suite","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-ANA009","title":"A007 unchecked-fclose detection regression-covered by the legacy test_analyze_rules.c suite (checked vs unchecked scenarios)","standard":"CERT-C","level":"ASIL-B"}, + {"id":"REQ-BADGE001","title":"cfusa badge --help returns zero","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE002","title":"cfusa badge generates an SVG badge when no report file exists","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE003","title":"cfusa badge renders a warning-colored badge when the report has warning findings","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE004","title":"cfusa badge renders a failing-colored badge when the report has error findings","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE005","title":"cfusa badge accepts a positional argument as the report path","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE006","title":"cfusa badge --label sets a custom badge label","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BADGE007","title":"cfusa badge rejects more than one positional argument","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-BOU001","title":"cfusa boundary --help does not crash","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-BOU002","title":"cfusa boundary generates both Mermaid and DOT dependency graphs","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-BOU003","title":"cfusa boundary --format dot outputs a DOT graph","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-BOU004","title":"cfusa boundary --format text outputs a text dependency list","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-BOU005","title":"cfusa boundary --format mermaid outputs a Mermaid graph","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-BOU006","title":"cfusa boundary --output-dir writes the graph to the given directory","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-CFG001","title":"cfusa_config_defaults populates non-empty project and version fields","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG002","title":"cfusa_config save creates a config file that round-trips through load","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG003","title":"cfusa_config load returns nonzero when no config file exists","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG004","title":"cfusa_config load handles malformed JSON gracefully instead of crashing","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG005","title":"cfusa_config exclude-pattern matching for an empty pattern list and a matching directory pattern","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG006","title":"cfusa_config strict-mode flag has a default value and round-trips through save/load","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CFG007","title":"cfusa_config_is_rule_disabled suppresses findings for rules listed in disabled_rules","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-CYB001","title":"CY001 — CWE-120: buffer copy without checking size","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB002","title":"CY002 — CWE-134: uncontrolled format string","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB003","title":"CY003 — CWE-78: OS command injection","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB004","title":"CY004 — CWE-476: NULL pointer dereference after allocation","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB005","title":"CY005 — CWE-190: integer overflow","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB006","title":"CY006 — CWE-416: use after free","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB007","title":"CY007 — CWE-415: double free","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB008","title":"CY008 — CWE-377: insecure temp file creation","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB009","title":"CY009 — CWE-327: use of a broken cryptographic algorithm","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB010","title":"CY010 — CWE-676: use of a potentially dangerous function","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB011","title":"CY004 NULL-dereference rule does not fire on a safe allocate-then-check pattern","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB012","title":"CY005 integer-overflow rule also fires on a malloc(n * size) multiplication pattern","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB013","title":"CY007 double-free rule fires when the same pointer is freed twice","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB014","title":"CY007 double-free rule does not fire when both free() calls are inside a comment","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB015","title":"CY008 insecure-temp-file rule also fires on tempnam()","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB016","title":"CY009 broken-crypto rule also fires on SHA-1","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB017","title":"CY010 dangerous-function rule also fires on strtok()","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB018","title":"CY010 dangerous-function rule does not fire on the safe getline() alternative","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB019","title":"CY011 — CWE-918: SSRF — URL/proxy taken from a variable and passed to curl","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB020","title":"CY012 — CWE-489: debug socket option left enabled","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB021","title":"CY013 — CWE-23: zip-slip — archive entry path used without sanitisation","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB022","title":"CY014 — CWE-326: weak/deprecated TLS method","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB023","title":"CY015 — CWE-89: SQL injection via sprintf","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB024","title":"CY016 — CWE-732: directory created with a world-writable/readable mode","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB025","title":"CY017 — CWE-732: file created with a world-readable/writable mode","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB026","title":"CY018 — CWE-22: path traversal — file path taken from argv/getenv","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB027","title":"CY019 — CWE-362: TOCTOU — access()/stat() check performed before open","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-CYB028","title":"CY020 — CWE-377: hardcoded predictable /tmp path","standard":"ISO 21434","level":"ASIL-B"}, + {"id":"REQ-DIFF001","title":"cfusa diff --help returns zero and missing arguments return an error","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-DIFF002","title":"cfusa diff reports an introduced finding in both text and JSON format","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-DIFF003","title":"cfusa diff of a report against itself returns zero introduced findings","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-DIFF004","title":"cfusa diff returns an error when a report file does not exist","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-DIFF005","title":"cfusa diff --format json on identical reports returns zero","standard":"ISO 26262","level":"ASIL-A"}, + {"id":"REQ-DISP002","title":"cfusa disposition add creates a disposition entry in .fusa-dispositions.json","standard":"ISO 26262","level":"ASIL-B"}, + {"id":"REQ-DISP003","title":"cfusa disposition list shows entries that were previously added","standard":"ISO 26262","level":"ASIL-B"}, + {"id":"REQ-FIX003","title":"cfusa fix runs on the gap-coverage test directory without crashing","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-FIX004","title":"cfusa fix --report writes a findings report to the given output path","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-FMEA003","title":"cfusa fmea --help returns zero","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA004","title":"cfusa fmea --format json writes fmea.json","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA005","title":"cfusa fmea --format csv writes fmea.csv","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA006","title":"cfusa fmea --format md writes fmea.md","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA007","title":"cfusa fmea with no --format flag writes both fmea.json and fmea.csv","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA008","title":"cfusa fmea --cyber adds a cybersecurity column to the FMEA output","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA009","title":"cfusa fmea --output-dir writes FMEA artifacts to the given directory","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA010","title":"cfusa fmea detects severity keywords in function names and comments","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA011","title":"cfusa fmea --format md --cyber includes the cybersecurity column in Markdown output","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-FMEA012","title":"cfusa fmea --format csv --cyber includes the cybersecurity column in CSV output","standard":"IEC 60812","level":"ASIL-A"}, + {"id":"REQ-IMP001","title":"cfusa impact rejects git refs containing shell metacharacters (e.g. semicolon, backtick) in --from/--to","standard":"ISO 26262","level":"ASIL-B"}, + {"id":"REQ-IMP002","title":"cfusa impact accepts valid branch names and SHA refs for --from/--to","standard":"ISO 26262","level":"ASIL-B"}, + {"id":"REQ-IMP003","title":"cfusa impact rejects an empty --from ref","standard":"ISO 26262","level":"ASIL-B"}, + {"id":"REQ-IMP004","title":"cfusa impact --help returns zero","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-IMP005","title":"cfusa impact loads registered requirement IDs from .fusa-reqs.json","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-LINT002","title":"L001 function-length rule does not fire on a short function","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT003","title":"L002 detects use of goto (MISRA-C 2012 Rule 15.1)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT004","title":"L002 goto rule does not fire when 'goto' appears inside a string literal","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT005","title":"L003 detects dynamic memory use — malloc/calloc/realloc/free (MISRA-C 2012 Rule 21.3)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT006","title":"L003 dynamic-memory rule fires on a standalone free() call","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT007","title":"L004 detects a directly recursive function call (MISRA-C 2012 Rule 17.2)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT008","title":"L005 detects use of #undef (MISRA-C 2012 Rule 20.5)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT009","title":"L006 detects setjmp/longjmp (MISRA-C 2012 Rule 17.4)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT010","title":"L006 setjmp/longjmp rule does not fire when the pattern appears inside a string literal","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT011","title":"L007 detects a global mutable variable (MISRA-C 2012 Rule 8.9 analogue)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT012","title":"L008 detects void* parameter usage (MISRA-C 2012 Rule 11.5)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT013","title":"L009 detects use of #pragma (MISRA-C 2012 Rule 20.10)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-LINT014","title":"L010 detects use of errno (MISRA-C 2012 Rule 22.8)","standard":"MISRA-C:2012","level":"ASIL-B"}, + {"id":"REQ-PR003","title":"cfusa pr --help returns zero","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR004","title":"cfusa pr new creates a problem-report entry","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR005","title":"cfusa pr close updates a problem report's status","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR006","title":"cfusa pr list returns cleanly when there are no problem reports","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR007","title":"cfusa pr list shows existing problem report entries","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR008","title":"cfusa pr close on a nonexistent report ID reports an error","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-PR009","title":"cfusa pr list --status filters to open problem reports","standard":"DO-178C","level":"ASIL-A"}, + {"id":"REQ-REQ001","title":"cfusa req list prints registered requirements when .fusa-reqs.json is present","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ002","title":"cfusa req filters output to a single known requirement ID","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ003","title":"cfusa req filtering on an unknown requirement ID returns no matches","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ004","title":"cfusa req falls back to scanning source annotations when the registry has no matching entry","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ005","title":"cfusa req runs cleanly with neither a requirements registry nor source annotations present","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ006","title":"cfusa req export writes requirements CSV to stdout","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ007","title":"cfusa req export writes requirements CSV to a file","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ008","title":"cfusa req import returns an error when no CSV path argument is given","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ009","title":"cfusa req import loads a valid requirements CSV","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ010","title":"cfusa req export returns an error when no requirements file exists","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-REQ011","title":"cfusa req import --format codebeamer parses a Codebeamer CSV export and prefixes generated IDs with CB-","standard":"DO-178C","level":"DAL-A"}, + {"id":"REQ-REQ012","title":"cfusa req import --format jama parses a Jama CSV export and prefixes generated IDs with JAMA-","standard":"DO-178C","level":"DAL-A"}, + {"id":"REQ-REQ013","title":"cfusa req import --format reqif parses a DOORS ReqIF XML export","standard":"DO-178C","level":"DAL-A"}, + {"id":"REQ-RPT001","title":"cfusa_report_init zeroes the finding count and error count","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT002","title":"cfusa_report_add increments the finding count and the per-severity error/warning counts","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT003","title":"cfusa_report compliance score is 100 for an empty report and decreases as error findings are added","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT004","title":"cfusa_severity_str renders ERROR/WARNING/INFO severities as their string names","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT005","title":"cfusa_report format-string parsing recognizes json/sarif and the other supported format names","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT006","title":"cfusa_report text and JSON printers do not crash on an empty or populated report","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT007","title":"cfusa_report JSON and text writers create the requested output file","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-RPT008","title":"cfusa_report Markdown renderer includes a heading","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-SCI003","title":"cfusa sci --format json writes the source file list with SHA-256 checksums","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-SCI004","title":"cfusa sci --format md writes a Markdown table of source files","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-SCI005","title":"cfusa sci --format text writes a plain-text file list","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-SCI006","title":"cfusa sci with no --format flag defaults to stdout output","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA001","title":"cfusa trace --help returns zero","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA002","title":"cfusa trace scans source annotations without crashing","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA003","title":"cfusa trace text format lists registered requirements","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA004","title":"cfusa trace --format json produces a JSON traceability matrix","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA005","title":"cfusa trace --format md produces a Markdown traceability matrix","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA006","title":"cfusa trace --output writes the traceability matrix to a file","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA007","title":"cfusa trace --req-coverage gate passes when coverage meets the threshold","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA008","title":"cfusa trace --req-coverage gate fails and exits nonzero below the threshold","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA009","title":"cfusa trace --sec-tested gate passes when coverage meets the threshold","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA010","title":"cfusa trace --sec-tested gate fails and exits nonzero below the threshold","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA011","title":"cfusa trace --gaps lists requirements when a registry is present","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA012","title":"cfusa trace --gaps lists requirements that have no //cfusa:test tag","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA013","title":"cfusa trace --no-legacy disables the legacy 'REQ:' annotation format","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA014","title":"cfusa trace --format md handles a project with no requirements registry","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-TRA015","title":"cfusa trace --format json handles a project with no requirements registry","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-UTIL001","title":"cfusa_match_outside_string matches a bare-line pattern and ignores matches inside string literals","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL002","title":"cfusa_match_outside_string matches text following a string literal and handles an empty line","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL003","title":"cfusa_match_outside_string handles escaped quotes and substring matches inside identifiers","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL004","title":"cfusa_walk_sources skips the vendor/ directory","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL005","title":"cfusa_walk_sources skips build directories","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL010","title":"cfusa basename helper extracts the file name from a path with and without a slash","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL011","title":"cfusa extension helper extracts the file extension for .c and .h files","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL012","title":"cfusa path-join helper joins path segments and handles a trailing slash","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL013","title":"cfusa count-lines helper counts lines in an empty file and a multi-line file","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL014","title":"cfusa count-C-files helper handles an empty directory and a nonexistent directory","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL015","title":"cfusa SHA-256 buffer hashing matches known-answer vectors for empty and non-empty input","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL016","title":"cfusa SHA-256 file hashing matches known content and does not crash on a nonexistent file","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-UTIL017","title":"cfusa timestamp helper returns a non-empty ISO-8601 timestamp containing 'T'","standard":"c-FuSa core","level":"ASIL-A"}, + {"id":"REQ-VULN004","title":"cfusa vuln detects a known-vulnerable strcpy() call in a scanned file","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-VULN005","title":"cfusa vuln --format json output contains the detected findings","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-VULN006","title":"cfusa vuln --output-dir writes the vulnerability report to the given directory","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-VULN007","title":"cfusa vuln --format text writes findings to an output file","standard":"c-FuSa CLI","level":"ASIL-A"}, + {"id":"REQ-VULN008","title":"cfusa vuln word-boundary matching avoids false positives on substrings of vulnerable function names","standard":"c-FuSa CLI","level":"ASIL-A"} ] } diff --git a/CMakeLists.txt b/CMakeLists.txt index 2af7597..04cc612 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) project(cfusa - VERSION 0.5.35 + VERSION 0.5.45 DESCRIPTION "C functional safety toolkit" LANGUAGES C ) diff --git a/safety-case.md b/safety-case.md index 665a444..e77e19d 100644 --- a/safety-case.md +++ b/safety-case.md @@ -1,6 +1,6 @@ # c-FuSa Safety Case -**Project:** c-FuSa v0.5.0 +**Project:** c-FuSa v0.5.45 **Standard:** ISO 26262-8:2018 §11 (Tool Classification and Qualification) **Tool Classification:** TCL-3 (software tool affecting development output) **Generated:** 2026-06-11 diff --git a/tara.md b/tara.md index 6ba7f50..4b8a918 100644 --- a/tara.md +++ b/tara.md @@ -1,6 +1,6 @@ # c-FuSa Threat Analysis and Risk Assessment (TARA) -**Project:** c-FuSa v0.5.0 +**Project:** c-FuSa v0.5.45 **Standard:** ISO 21434:2021 §9 **Generated:** 2026-06-11