mirror of
https://github.com/openai/codex.git
synced 2026-04-25 15:15:15 +00:00
## Why The Bazel-backed `argument-comment-lint` CI path had two gaps: - Bazel wildcard target expansion skipped inline unit-test crates from `src/` modules because the generated `*-unit-tests-bin` `rust_test` targets are tagged `manual`. - `argument-comment-mismatch` was still only a warning in the Bazel and packaged-wrapper entrypoints, so a typoed `/*param_name*/` comment could still pass CI even when the lint detected it. That left CI blind to real linux-sandbox examples, including the missing `/*local_port*/` comment in `codex-rs/linux-sandbox/src/proxy_routing.rs` and typoed argument comments in `codex-rs/linux-sandbox/src/landlock.rs`. ## What Changed - Added `tools/argument-comment-lint/list-bazel-targets.sh` so Bazel lint runs cover `//codex-rs/...` plus the manual `rust_test` `*-unit-tests-bin` targets. - Updated `just argument-comment-lint`, `rust-ci.yml`, and `rust-ci-full.yml` to use that helper. - Promoted both `argument-comment-mismatch` and `uncommented-anonymous-literal-argument` to errors in every strict entrypoint: - `tools/argument-comment-lint/lint_aspect.bzl` - `tools/argument-comment-lint/src/bin/argument-comment-lint.rs` - `tools/argument-comment-lint/wrapper_common.py` - Added wrapper/bin coverage for the stricter lint flags and documented the behavior in `tools/argument-comment-lint/README.md`. - Fixed the now-covered callsites in `codex-rs/linux-sandbox/src/proxy_routing.rs`, `codex-rs/linux-sandbox/src/landlock.rs`, and `codex-rs/core/src/shell_snapshot_tests.rs`. This keeps the Bazel target expansion narrow while making the Bazel and prebuilt-linter paths enforce the same strict lint set. ## Verification - `python3 -m unittest discover -s tools/argument-comment-lint -p 'test_*.py'` - `cargo +nightly-2025-09-18 test --manifest-path tools/argument-comment-lint/Cargo.toml` - `just argument-comment-lint`
171 lines
5.8 KiB
Markdown
171 lines
5.8 KiB
Markdown
# argument-comment-lint
|
|
|
|
Isolated [Dylint](https://github.com/trailofbits/dylint) library for enforcing
|
|
Rust argument comments in the exact `/*param*/` shape.
|
|
|
|
Prefer self-documenting APIs over comment-heavy call sites when possible. If a
|
|
call site would otherwise read like `foo(false)` or `bar(None)`, consider an
|
|
enum, named helper, newtype, or another idiomatic Rust API shape first, and
|
|
use an argument comment only when a smaller compatibility-preserving change is
|
|
more appropriate.
|
|
|
|
It provides two lints:
|
|
|
|
- `argument_comment_mismatch` (`warn` by default): validates that a present
|
|
`/*param*/` comment matches the resolved callee parameter name.
|
|
- `uncommented_anonymous_literal_argument` (`allow` by default): flags
|
|
anonymous literal-like arguments such as `None`, `true`, `false`, and numeric
|
|
literals when they do not have a preceding `/*param*/` comment.
|
|
|
|
String and char literals are exempt because they are often already
|
|
self-descriptive at the callsite.
|
|
|
|
## Behavior
|
|
|
|
Given:
|
|
|
|
```rust
|
|
fn create_openai_url(base_url: Option<String>, retry_count: usize) -> String {
|
|
let _ = (base_url, retry_count);
|
|
String::new()
|
|
}
|
|
```
|
|
|
|
This is accepted:
|
|
|
|
```rust
|
|
create_openai_url(/*base_url*/ None, /*retry_count*/ 3);
|
|
```
|
|
|
|
This is warned on by `argument_comment_mismatch`:
|
|
|
|
```rust
|
|
create_openai_url(/*api_base*/ None, 3);
|
|
```
|
|
|
|
This is only warned on when `uncommented_anonymous_literal_argument` is enabled:
|
|
|
|
```rust
|
|
create_openai_url(None, 3);
|
|
```
|
|
|
|
## Development
|
|
|
|
Install the required tooling once:
|
|
|
|
```bash
|
|
cargo install cargo-dylint dylint-link
|
|
rustup toolchain install nightly-2025-09-18 \
|
|
--component llvm-tools-preview \
|
|
--component rustc-dev \
|
|
--component rust-src
|
|
```
|
|
|
|
Run the lint crate tests:
|
|
|
|
```bash
|
|
cd tools/argument-comment-lint
|
|
cargo test
|
|
```
|
|
|
|
GitHub releases also publish a DotSlash file named
|
|
`argument-comment-lint` for macOS arm64, Linux arm64, Linux x64, and Windows
|
|
x64. The published package contains a small runner executable, a bundled
|
|
`cargo-dylint`, and the prebuilt lint library.
|
|
|
|
The package is not a full Rust toolchain. Running the prebuilt path still
|
|
requires the pinned nightly toolchain to be installed via `rustup`:
|
|
|
|
```bash
|
|
rustup toolchain install nightly-2025-09-18 \
|
|
--component llvm-tools-preview \
|
|
--component rustc-dev \
|
|
--component rust-src
|
|
```
|
|
|
|
The checked-in DotSlash file lives at `tools/argument-comment-lint/argument-comment-lint`.
|
|
`run-prebuilt-linter.py` resolves that file via `dotslash` and is the path used by
|
|
targeted package runs such as `just argument-comment-lint -p codex-core`.
|
|
Repo-wide runs now go through a native Bazel aspect that invokes a custom
|
|
`rustc_driver` and reuses Bazel-managed Rust dependency metadata instead of
|
|
spawning `cargo dylint` once per crate. The source-build path remains available
|
|
in `run.py` for people iterating on the lint crate itself.
|
|
|
|
The Unix archive layout is:
|
|
|
|
```text
|
|
argument-comment-lint/
|
|
bin/
|
|
argument-comment-lint
|
|
cargo-dylint
|
|
lib/
|
|
libargument_comment_lint@nightly-2025-09-18-<target>.dylib|so
|
|
```
|
|
|
|
On Windows the same layout is published as a `.zip`, with `.exe` and `.dll`
|
|
filenames instead.
|
|
|
|
DotSlash resolves the package entrypoint to `argument-comment-lint/bin/argument-comment-lint`
|
|
(or `.exe` on Windows). That runner finds the sibling bundled `cargo-dylint`
|
|
binary and the single packaged Dylint library under `lib/`, normalizes the
|
|
host-qualified nightly filename to the plain `nightly-2025-09-18` channel when
|
|
needed, and then invokes `cargo-dylint dylint --lib-path <that-library>` with
|
|
the repo's default `DYLINT_RUSTFLAGS` and `CARGO_INCREMENTAL=0` settings.
|
|
|
|
The checked-in `run-prebuilt-linter.py` wrapper uses the fetched package
|
|
contents directly so the current checked-in alpha artifact works the same way.
|
|
It also makes sure the `rustup` shims stay ahead of any direct toolchain
|
|
`cargo` binary on `PATH`, and sets `RUSTUP_HOME` from `rustup show home` when
|
|
the environment does not already provide it. That extra `RUSTUP_HOME` export is
|
|
required for the current Windows Dylint driver path.
|
|
|
|
If you are changing the lint crate itself, use the source-build wrapper:
|
|
|
|
```bash
|
|
./tools/argument-comment-lint/run.py -p codex-core
|
|
```
|
|
|
|
Run the lint against `codex-rs` from the repo root:
|
|
|
|
```bash
|
|
just argument-comment-lint
|
|
bazel build --config=argument-comment-lint -- \
|
|
$(./tools/argument-comment-lint/list-bazel-targets.sh)
|
|
./tools/argument-comment-lint/run-prebuilt-linter.py -p codex-core
|
|
just argument-comment-lint -p codex-core
|
|
```
|
|
|
|
If no package selection is provided, `just argument-comment-lint` now defaults
|
|
to the Bazel aspect path over `//codex-rs/...`. The Python wrappers remain the
|
|
package-scoped escape hatch and still default the underlying Cargo invocation
|
|
to `--all-targets` unless you explicitly narrow the target set, so targeted
|
|
wrapper runs cover test-only call sites by default. The Bazel entrypoints use
|
|
`tools/argument-comment-lint/list-bazel-targets.sh` to add the internal
|
|
manual `*-unit-tests-bin` Rust targets explicitly, so inline `#[cfg(test)]`
|
|
call sites are covered without pulling in unrelated manual release targets.
|
|
|
|
Repo runs also promote `argument_comment_mismatch` and
|
|
`uncommented_anonymous_literal_argument` to errors by default:
|
|
|
|
```bash
|
|
./tools/argument-comment-lint/run-prebuilt-linter.py -p codex-core
|
|
```
|
|
|
|
The wrapper does that by setting `DYLINT_RUSTFLAGS`, and it leaves an explicit
|
|
existing setting alone. It also defaults `CARGO_INCREMENTAL=0` unless you have
|
|
already set it, because the current nightly Dylint flow can otherwise hit a
|
|
rustc incremental compilation ICE locally. To override that behavior for an ad
|
|
hoc run:
|
|
|
|
```bash
|
|
DYLINT_RUSTFLAGS="-A argument-comment-mismatch -A uncommented-anonymous-literal-argument" \
|
|
CARGO_INCREMENTAL=1 \
|
|
./tools/argument-comment-lint/run.py -p codex-core
|
|
```
|
|
|
|
To override an explicitly narrow target selection, or to be explicit in scripts:
|
|
|
|
```bash
|
|
./tools/argument-comment-lint/run-prebuilt-linter.py -p codex-core -- --all-targets
|
|
```
|