Skip to content

Release v0.9.0

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Oct 07:33

Highlights

A correctness release. Clone groups no longer admit members that overlap or that no single build compiles together, compiler helpers read only the compilation database the scan selected, native artifact symbols and relocations resolve through one index, and report options are checked before any work starts. No new features.

Before you upgrade

The database and baseline schemas did not change. A 0.8.0 database opens as it is.

  • SARIF categories. Every build-variant partition run and every comparison now carries its own automationDetails id. GitHub code scanning keeps one category per run, so uploads made under the previous ids are treated as a separate analysis once the new ones arrive.
  • Some group ids change. Semantic and cross-language group ids are now derived from window content alone, so editing the surrounding code or shifting a window's rank no longer changes them. A group whose members overlapped in one file is now split or dropped. Against an existing baseline these can show as new once; refresh the baseline if they do.
  • The first scan after upgrading is not reused. Run reuse now keys on the settings that decide the rows (detection configuration, and a baseline by what it hides), so output, database, report and jobs settings no longer invalidate it. The digest changed shape, so the first scan runs in full.
  • Native artifact fingerprints change. A symbol's relocations are now part of its fingerprint, so byte-identical code calling different targets is no longer reported as a duplicate. artifact compare across the upgrade can show native symbols as removed and added.

Source scanning

  • A clone group admits a member only when it does not overlap another member in its file and, with preprocessor arms, can be compiled in one build with the others.
  • A renamed group is matched to each member of an outer group at most once, so an exact repeat inside one renamed member keeps its group.
  • A discovery root that is a file is refused. Multi-letter extensions are classified regardless of case, single letters stay case-sensitive, and .cp is C++.
  • The C lexer skips a quoted literal inside a preprocessor directive, so a comment opener inside it is not read as a comment. A block macro inside a member function body is no longer read as a method.
  • Rust: call and index chains count toward the nesting budget, and async / async move closures are closure units.
  • Suppression marker lookup stays linear in the length of a line.
  • A group hidden by a rule other than the baseline is neither carried nor reported as new after an unchanged rescan.

Semantic mode and helpers

  • The Clang helper reads the compilation database that discovery selected, instead of searching upward from each source, so a database above the scanned tree is no longer picked up. .C is compiled as C++, matching discovery.
  • A translation unit that Clang reads with errors is reported as a helper failure carrying the first error, instead of being answered from recovered types.
  • When build scripts are permitted, a crate whose build script fails is reported as a helper failure with its error.
  • Helpers read configuration, manifests and lockfiles only when they are regular files under the size ceiling, so a FIFO or an oversized file is passed over rather than waited on. The configured helper timeout now also applies to discovery and the handshake.
  • doctor reports a helper that was found but cannot be used, with its reason, separately from a missing one.
  • A run with a helper failure is not reused once the helper answers.

Reports, database and cache

  • report refuses a named database together with --no-record, --suggest or --until, and a deny-asymmetric flag together with paths, as usage errors before touching any database. Text-only flags are checked against the output format, and the destination is checked before rendering.
  • scan, report, cache and doctor resolve the database the same way, so cache status, prune and clear act on the file a read uses. A subdirectory configuration's default database stays at the repository root.
  • The latest run is chosen by start time, so a reused run counts as the newest and a running or failed run is never returned as the latest.
  • A seam delta is reported only when both ledger entries describe the same seam.
  • config show notes when a discovered configuration's [helpers] section is disregarded.
  • scan_lock is reported as in use only on lock contention; other lock failures name their cause.

Artifact analysis

  • ELF, PE/COFF and archive IRs record the instruction architecture; an archive keeps one only when all its members agree. Calibration refuses to mix formats, architectures or universal slices, and comparisons state differing architectures.
  • 32-bit ARM addresses have the Thumb bit cleared. A symbol starting inside bytes another symbol owns is treated as an alias, so copied bytes never exceed the section.
  • A section symbol plus addend resolves to the function it reaches.
  • Text and CSV reports now show the analysis id, architecture and counts that JSON already carried.
  • CSV fields that begin with a carriage return are guarded against spreadsheet formula injection.
  • An analysis whose IR exceeds the storage cap is reported but not saved, instead of failing.
  • Calibration and report replay read every partition of the newest invocation.

Library crates

  • codehelion-artifact: native::symbol_size is removed. NativeTextSymbols::symbols is replaced by index: SymbolIndex, which resolves addresses and relocations (ResolvedRelocation, ResolvedTarget). ArtifactSliceKey and slice_key / slice_fingerprint are new.
  • codehelion-helper-protocol: the describe-build and analyze requests gain an optional compilation_database, so struct literals need updating. The tree_file module is new.
  • codehelion-helper: re-exports tree_file and adds MAX_FILE_BYTES_ENV and a file ceiling on the sandbox.

Full Changelog: v0.8.0...v0.9.0