feat(fuzz): make fuzz compile/run - #140
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
Restores the ability to compile and run the existing cargo-fuzz harness by gating/re-exporting the generated cantools C bindings behind a dedicated feature and updating the fuzz target to use those bindings safely.
Changes:
- Add a
fuzzfeature totesting/cantools-messagesand re-export generated bindgen symbols when enabled. - Update the fuzz target to pack via cantools and compare output bytes (with a small tolerance for float/encode differences).
- Add a
just fuzzhelper target and update the fuzz crate dependency/lockfile.
Reviewed changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| testing/cantools-messages/src/lib.rs | Compiles bindings for tests or fuzz feature; re-exports bindgen API for fuzz crate. |
| testing/cantools-messages/Cargo.toml | Introduces fuzz feature flag for binding exposure. |
| justfile | Adds a fuzz recipe to run cargo +nightly fuzz. |
| fuzz/fuzz_targets/fuzz_target_1.rs | Uses fuzz input, calls cantools pack with raw-pointer-safe address, compares packed bytes. |
| fuzz/Cargo.toml | Enables cantools-messages fuzz feature for fuzzing build. |
| fuzz/Cargo.lock | Updates fuzz subproject lockfile after dependency resolution. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| # Run cargo fuzz tests. Requires nightly toolchain (install with `rustup install nightly`) | ||
| fuzz: | ||
| RUSTFLAGS='-C target-feature=-crt-static' cargo +nightly fuzz run fuzz_target_1 --target $(rustc --print host-tuple) |
There was a problem hiding this comment.
The --target value is computed using rustc from the default toolchain, but this recipe runs cargo +nightly. On systems without the stable toolchain installed (or with a different default toolchain), $(rustc --print host-tuple) can fail or disagree with nightly. Use rustc +nightly --print host-tuple (or drop the explicit --target if not needed).
| RUSTFLAGS='-C target-feature=-crt-static' cargo +nightly fuzz run fuzz_target_1 --target $(rustc --print host-tuple) | |
| RUSTFLAGS='-C target-feature=-crt-static' cargo +nightly fuzz run fuzz_target_1 --target $(rustc +nightly --print host-tuple) |
| // Cantools C uses truncation for encode (e.g. (uint8_t)(value/0.39)) while dbc-codegen | ||
| // may round; allow off-by-one in the first byte (Two signal) due to this. |
There was a problem hiding this comment.
This comment says dbc-codegen "may round", but dbc-codegen’s float encoding path truncates after a float division/cast (similar to C). If you’re seeing off-by-one, it’s more likely due to float precision differences (Rust uses f32 internally vs cantools using double) rather than rounding. Suggest updating the comment to reflect the actual cause so future readers don’t chase the wrong behavior.
| // Cantools C uses truncation for encode (e.g. (uint8_t)(value/0.39)) while dbc-codegen | |
| // may round; allow off-by-one in the first byte (Two signal) due to this. | |
| // Cantools C uses truncation for encode (e.g. (uint8_t)(value/0.39)). dbc-codegen's | |
| // encode path also truncates, but uses f32 internally (vs. cantools' double), so minor | |
| // precision differences can cause an off-by-one in the first byte (Two signal); allow that. |
I have no clue what this does - fuzzing was broken for a long time, or at least never re-validated it seems (not part of CI, no docs). I fixed it with AI, plus some manual cleanup to remove AI-isms. Fuzzing was added in 2021 by Marcel in e41daa8 , any guidance would be good :)
## 🤖 New release
* `dbc-codegen`: 0.3.0 -> 0.4.0 (⚠ API breaking changes)
* `dbc-codegen-cli`: 0.3.0 -> 0.4.0
### ⚠ `dbc-codegen` breaking changes
```text
--- failure function_missing: pub fn removed or renamed ---
Description:
A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely.
ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/function_missing.ron
Failed in:
function dbc_codegen::codegen, previously in file /tmp/.tmp0XWOqx/dbc-codegen/src/lib.rs:24
```
<details><summary><i><b>Changelog</b></i></summary><p>
## `dbc-codegen`
<blockquote>
##
[0.4.0](v0.3.0...v0.4.0) -
2026-09-22
### Added
- *(fuzz)* make fuzz compile/run
([#140](#140))
- optional padding bit value
([#184](#184))
- add `DBC_FILE_NAME` + ver, proper code formatting
([#131](#131))
- [**breaking**] streamline DBC code generation and file writing
([#128](#128))
### Fixed
- support large min/max values without precision loss
([#152](#152))
- handle duplicate signal names
([#126](#126))
- handle empty relevant msgs in from_can_message
([#125](#125))
- fix typo
- fix formatting errors
- fix factor/offset not getting applied to 0 for unsigned case
- fix duplicate enum names on multiplex messages
- fix issue where signed signals would be rendered as unsigned
### Other
- 2024 edition, bump deps, minor fixes
([#196](#196))
- [pre-commit.ci] pre-commit autoupdate
([#189](#189))
- *(deps)* bump actions/checkout from 6 to 7 in the
all-actions-version-updates group across 1 directory
([#191](#191))
- Remove unsafe from generated MESSAGE_ID constants
([#194](#194))
- Generate raw signal getters and setters
([#193](#193))
- Support relation attributes in attribute_structs
([#192](#192))
- Generate enum-typed setters and constructors for signals with value
descriptions ([#178](#178))
- Emit MESSAGE_CYCLE_TIME as integer
([#186](#186))
- Generate message size and cycle time consts
([#176](#176))
- Add option to generate typed constants from DBC attributes
([#175](#175))
- update can-dbc
([#181](#181))
- rust ver bump ([#182](#182))
- cleanup clippy, justfile, and proj cleanup
([#180](#180))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 4 updates ([#172](#172))
- *(deps)* bump codecov/codecov-action from 6 to 7 in the
all-actions-version-updates group
([#165](#165))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 4 updates ([#168](#168))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 3 updates ([#163](#163))
- *(deps)* bump the all-cargo-version-updates group with 2 updates
([#161](#161))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 2 updates ([#158](#158))
- *(deps)* bump the all-actions-version-updates group across 1 directory
with 2 updates ([#159](#159))
- update expected errors to Rust 1.94
([#153](#153))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 2 updates ([#145](#145))
- *(deps)* bump insta from 1.46.2 to 1.46.3 in the
all-cargo-version-updates group
([#143](#143))
- upgrade to rust 1.93 stderr
([#142](#142))
- *(deps)* bump the all-cargo-version-updates group across 1 directory
with 4 updates ([#141](#141))
- [**breaking**] remove main fn from generated code
([#138](#138))
- make many rendering fn methods on config
([#133](#133))
- *(deps)* bump clap from 4.5.54 to 4.5.55 in the
all-cargo-version-updates group
([#134](#134))
- use `quote` crate to handle str escaping
([#132](#132))
- noop - dedup, cleanup, new type abstraction
([#130](#130))
- update shared tests, bump deps, freeze to rust 1.92
([#127](#127))
- *(deps)* bump can-dbc from 8.0.0 to 8.0.1 in the
all-cargo-version-updates group
([#129](#129))
- do not clean lock
- bump dependencies and enable verbose output for release actions
([#120](#120))
- [pre-commit.ci] pre-commit autoupdate
([#119](#119))
- Bump the all-cargo-version-updates group across 1 directory with 2
updates ([#118](#118))
- refactor write functions, improve CI, MSRV
([#116](#116))
- minor code cleanup
([#114](#114))
- generate and compile all .dbc files from test repo
([#113](#113))
- allow generated file to be used with `include!`
([#108](#108))
- Bump the all-cargo-version-updates group across 1 directory with 2
updates ([#111](#111))
- minor justfile fix, editorconfig
([#112](#112))
- Bump actions/cache from 4 to 5 in the all-actions-version-updates
group ([#110](#110))
- OxiBUS onboarding cleanup
([#102](#102))
- run `just fmt` to cleanup imports
([#107](#107))
- Bump the all-cargo-version-updates group across 1 directory with 9
updates ([#106](#106))
- upgrade to can-dbc v8
([#101](#101))
- Bump actions/checkout from 1 to 6 in the all-actions-version-updates
group ([#104](#104))
- *(CI)* minor CI updates, automate dependabot
([#103](#103))
- Add optional defmt::Format support for generated types
- Merge pull request #85 from inomotech-foss/fix-mux-msg-id
- Use message name instead of self
- Generate embedded_can::Frame trait for each frame
- Represent CAN message IDs as embedded_can::Id to support extended IDs
- Fix issue with decoding signed values of non-standard length
- revert change to Cargo.toml, not necessary
- address clippy's concerns (thanks clippy), enhance comments
- make can-messages dependency optional so it doesn't pull in std
- reduce diff against main
- handle more edge cases, use i128 as the maximum type
- reorder lines to match signals
- drop symlink in favor of copy so it works on Windows
- revert because I missed the case of check_ranges being false
- add tests, edge cases where the min/max is way less than signal width
- clean up warning
- add unsigned to the name, add test case
- change signal logic to handle negative factors, add tests
- Bump rustc to latest stable, 1.78
- Merge pull request #68 from projectgus/tweaks/codegen_warnings
- Rename .envrc for non-Nix users, add note in README
- dont assign signed integers to unsigned integers
- Update README
- Fix clippy warnings
- Use checked_sub(offset) for set_signal methods
- Don't treat signals as floats if factor is integer
- Add flag to impl std Error
- Tweak docs and optional features
- Make feature-gated impls configurable
</blockquote>
## `dbc-codegen-cli`
<blockquote>
##
[0.4.0](v0.3.0...v0.4.0) -
2026-09-22
### Added
- [**breaking**] streamline DBC code generation and file writing
([#128](#128))
### Other
- 2024 edition, bump deps, minor fixes
([#196](#196))
- Generate raw signal getters and setters
([#193](#193))
- Support relation attributes in attribute_structs
([#192](#192))
- Generate message size and cycle time consts
([#176](#176))
- Add option to generate typed constants from DBC attributes
([#175](#175))
- cleanup clippy, justfile, and proj cleanup
([#180](#180))
- *(deps)* bump the all-cargo-version-updates group with 2 updates
([#161](#161))
- minor code cleanup
([#114](#114))
- allow generated file to be used with `include!`
([#108](#108))
- OxiBUS onboarding cleanup
([#102](#102))
- run `just fmt` to cleanup imports
([#107](#107))
- Bump the all-cargo-version-updates group across 1 directory with 9
updates ([#106](#106))
- upgrade to can-dbc v8
([#101](#101))
- make debug_prints configurable
- Merge pull request #68 from projectgus/tweaks/codegen_warnings
- Rename .envrc for non-Nix users, add note in README
- Update README
- Make feature-gated impls configurable
</blockquote>
</p></details>
---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
I have no clue what this does - fuzzing was broken for a long time, or at least never re-validated it seems (not part of CI, no docs). I fixed it with AI, plus some manual cleanup to remove AI-isms.
Fuzzing was added in 2021 by @marcelbuesing in e41daa8 -- any help or guidance would be good :)
The biggest question of course - is there actually any benefit from this code, or should it be scrapped and re-done from scratch, and if so, any advice on that too?