-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tracking issue for function attribute #[coverage]
#84605
Comments
cc: @tmandry @wesleywiser |
Nit: should probably follow the pattern of |
Just a wish that I have: Another thing I wish for would be a crate-level attr that would disable coverage for every |
Adds feature-gated `#[no_coverage]` function attribute, to fix derived Eq `0` coverage issue rust-lang#83601 Derived Eq no longer shows uncovered The Eq trait has a special hidden function. MIR `InstrumentCoverage` would add this function to the coverage map, but it is never called, so the `Eq` trait would always appear uncovered. Fixes: rust-lang#83601 The fix required creating a new function attribute `no_coverage` to mark functions that should be ignored by `InstrumentCoverage` and the coverage `mapgen` (during codegen). Adding a `no_coverage` feature gate with tracking issue rust-lang#84605. r? `@tmandry` cc: `@wesleywiser`
I considered this, and discussed it in the initial PR. I'll copy those comments to this tracking issue, to make it easer to read and reply: @tmandry said:
@richkadel replied:
@tmandry replied:
|
@Swatinem - Can you expand on this? What are the use cases for disabling coverage at the crate level, or in crate tests? For example, the use case addressed in PR #83601 is clear: The implementation of I personally see the Generally speaking... I think we want to keep the bar high for now (by restricting the scope of the attribute to functions, until any broader requirement is vetted by the Rust community). So if there are other strong cases for excluding coverage instrumentation, please post them here so we can validate the use cases before expanding the scope of the coverage attribute. |
One more comment for clarity: PR #83601 has been merged and adds the feature-gated |
I should have added: This tracking issue will remain open until the attribute is stablized. This means there is still an opportunity to change the attribute, based on the tracking issue feedback. Thanks! |
This might be a bit personal preference, but is also done that way in other language ecosystems. |
Note: there are previous initiatives to introduce inheritable/scoped/propagated attributes, e.g. for the optimize attribute, but implementing the propagation behaviour there seemed to be pretty involved to me at the time and IMO any attempts to introduce such attribute propagation mechanisms should be a standalone RFC introducing a mechanism in a more general way. |
72: Set cfg(coverage) to easily use #[no_coverage] r=taiki-e a=taiki-e To exclude the specific function from coverage, use the `#[no_coverage]` attribute (rust-lang/rust#84605). Since `#[no_coverage]` is unstable, it is recommended to use it together with `cfg(coverage)` set by cargo-llvm-cov. ```rust #![cfg_attr(coverage, feature(no_coverage))] #[cfg_attr(coverage, no_coverage)] fn exclude_from_coverage() { // ... } ``` Closes #71 Co-authored-by: Taiki Endo <[email protected]>
Would it be possible to add this attribute to the code generated by |
Unfortunately, I can understand the motivation for this request, and you may want to file a new issue, if it doesn't already exist. There is a potential downside: coverage reports would not be able to show that an unreachable block was unintentionally executed. Maybe that's a minor tradeoff, but the current coverage reports confirm that unreachable blocks are not reached, by showing the unreachable block has a coverage count of zero. I think adding support for |
And I may be wrong about block |
To me, For macros, we can just think about this as applying to a particular expansion (and the attribute applies to the block in HIR, i.e. after macro expansion). Maybe there are other issues I'm not thinking about. |
I don't think accidentally executing an "unreachable" expression is an issue for coverage, as that's not the job of coverage; tests are where that should be caught. There is a tracking issue for this already, I wasn't sure if there was an easy-ish way to land it. Apparently that's not the case. I would imagine in the future statement and expression-level masking for coverage purposes will exist, which would necessarily allow for this. Ultimately this would just cause the macro to include the attribute in its expansion. |
Is there a good reason why derived traits are included in coverage reports, and not also marked as But, I could see an argument for including them by default but allowing a |
In terms of specifically how this attribute should be named, I would be in favour of going with a
This obviously wouldn't be required for an initial stable |
I'm not convinced ignoring trait functions is a good idea, from a test coverage perspective. When you derive a trait, your struct's API contract has changed. That struct now supports every function defined in that trait. To guarantee 100% test coverage of the behaviors of every function for your struct, you would have to test it. Without adding a test, the " |
Yes, the API contract changes when you derive standard traits, but I personally don't believe that testing them adds any value for the developer. For example, I should clarify I'm explicitly talking about the standard derives; individual proc macros can make the decision whether they want to add the attribute to their generated code or not. |
This might come late in the discussion, but have you considered stabilizing coverage as a diagnostic namespace attribute? E.g.: #[diagnostic::coverage(off)]
fn foobar() {} The main advantage of doing that is that people could then use coverage annotations while keeping a MSRV of And I do think coverage as a diagnostic makes sense. Yes, it changes the emitted artifact, but it doesn't change the program semantics. And more importantly, it doesn't affect dependencies: if a dependency has coverage annotations you don't understand, you can just ignore them without negative impact to your output. |
Coverage isn't a diagnostic, though; it's a build flag that can change the way the crate is built under certain circumstances. |
…e, r=wesleywiser Stabilize #[coverage] attribute Closes rust-lang#84605, which passed FCP. Stabilisation report here: rust-lang#84605 (comment) Also added to reference here: rust-lang/reference#1628
…e, r=<try> Stabilize #[coverage] attribute Closes rust-lang#84605, which passed FCP. Stabilisation report here: rust-lang#84605 (comment) Also added to reference here: rust-lang/reference#1628 --- try-job: aarch64-apple try-job: x86_64-gnu try-job: x86_64-msvc
…e, r=<try> Stabilize #[coverage] attribute Closes rust-lang#84605, which passed FCP. Stabilisation report here: rust-lang#84605 (comment) Also added to reference here: rust-lang/reference#1628 --- try-job: aarch64-apple try-job: x86_64-gnu try-job: x86_64-msvc
@clarfonthey Are there any tests for this behavior:
|
I assume not, since it would be much more difficult to implement them applying to all downstream implementations since those are, effectively, completely different functions and completely different codegen as far as instrumentation is concerned. If you think a test should exist, I would file a new issue. Unless we plan to revert the stabilisation before release, I think that we should just open new issues to track new changes to this. |
I opened a PR to add the tests at #134517 |
…esleywiser Revert stabilization of the `#[coverage(..)]` attribute Due to a process mixup, the PR to stabilize the `#[coverage(..)]` attribute (rust-lang#130766) was merged while there are still outstanding concerns. The default action in that situation is to revert, and the feature is not sufficiently urgent or uncontroversial to justify special treatment, so this PR reverts that stabilization. --- - A key point that came up in offline discussions is that unlike most user-facing features, this one never had a proper RFC, so parts of the normal stabilization process that implicitly rely on an RFC break down in this case. - As the implementor and de-facto owner of the feature in its current form, I would like to think that I made good choices in designing and implementing it, but I don't feel comfortable proceeding to stabilization without further scrutiny. - There hasn't been a clear opportunity for T-compiler to weigh in or express concerns prior to stabilization. - The stabilization PR cites a T-lang FCP that occurred in the tracking issue, but due to the messy design and implementation history (and lack of a clear RFC), it's unclear what that FCP approval actually represents in this case. - At the very least, we should not proceed without a clear statement from T-lang or the relevant members about the team's stance on this feature, especially in light of the other concerns listed here. - The existing user-facing documentation doesn't clearly reflect which parts of the feature are stable commitments, and which parts are subject to change. And there doesn't appear to be a clear consensus anywhere about where that line is actually drawn, or whether the chosen boundary is acceptable to the relevant teams and individuals. - For example, the [stabilization report comment](rust-lang#84605 (comment)) mentions that some aspects are subject to change, but that text isn't consistent with my earlier comments, and there doesn't appear to have been any explicit discussion or approval process. - [The current reference text](https://github.com/rust-lang/reference/blob/4dfaa4f/src/attributes/coverage-instrumentation.md) doesn't mention this distinction at all, and instead simply describes the current implementation behaviour. - When the implementation was changed to its current form, the associated user-facing error messages were not updated, so they still refer to the attribute only being allowed on functions and closures. - On its own, this might have been reasonable to fix-forward in the absence of other concerns, but the fact that it never came up earlier highlights the breakdown in process that has occurred here. --- Apologies to everyone who was excited for this stabilization to land, but unfortunately it simply isn't ready yet.
…eywiser Stabilize #[coverage] attribute Closes #84605, which passed FCP. Stabilisation report here: rust-lang/rust#84605 (comment) Also added to reference here: rust-lang/reference#1628 --- try-job: aarch64-apple try-job: x86_64-gnu try-job: x86_64-msvc
Rollup merge of rust-lang#134672 - Zalathar:revert-coverage-attr, r=wesleywiser Revert stabilization of the `#[coverage(..)]` attribute Due to a process mixup, the PR to stabilize the `#[coverage(..)]` attribute (rust-lang#130766) was merged while there are still outstanding concerns. The default action in that situation is to revert, and the feature is not sufficiently urgent or uncontroversial to justify special treatment, so this PR reverts that stabilization. --- - A key point that came up in offline discussions is that unlike most user-facing features, this one never had a proper RFC, so parts of the normal stabilization process that implicitly rely on an RFC break down in this case. - As the implementor and de-facto owner of the feature in its current form, I would like to think that I made good choices in designing and implementing it, but I don't feel comfortable proceeding to stabilization without further scrutiny. - There hasn't been a clear opportunity for T-compiler to weigh in or express concerns prior to stabilization. - The stabilization PR cites a T-lang FCP that occurred in the tracking issue, but due to the messy design and implementation history (and lack of a clear RFC), it's unclear what that FCP approval actually represents in this case. - At the very least, we should not proceed without a clear statement from T-lang or the relevant members about the team's stance on this feature, especially in light of the other concerns listed here. - The existing user-facing documentation doesn't clearly reflect which parts of the feature are stable commitments, and which parts are subject to change. And there doesn't appear to be a clear consensus anywhere about where that line is actually drawn, or whether the chosen boundary is acceptable to the relevant teams and individuals. - For example, the [stabilization report comment](rust-lang#84605 (comment)) mentions that some aspects are subject to change, but that text isn't consistent with my earlier comments, and there doesn't appear to have been any explicit discussion or approval process. - [The current reference text](https://github.com/rust-lang/reference/blob/4dfaa4f/src/attributes/coverage-instrumentation.md) doesn't mention this distinction at all, and instead simply describes the current implementation behaviour. - When the implementation was changed to its current form, the associated user-facing error messages were not updated, so they still refer to the attribute only being allowed on functions and closures. - On its own, this might have been reasonable to fix-forward in the absence of other concerns, but the fact that it never came up earlier highlights the breakdown in process that has occurred here. --- Apologies to everyone who was excited for this stabilization to land, but unfortunately it simply isn't ready yet.
Add tests for coverage attribute on trait functions This adds tests for the coverage attribute on trait functions. cc rust-lang#84605 (comment)
This was auto-closed by #130766, but that has since been reverted (#134672) due to outstanding concerns. This remains the canonical tracking issue for the coverage attribute, but since it's long and unwieldy I'm thinking of opening a separate issue to focus directly on the remaining steps, and linking it from the top of this issue page. EDIT: New stabilization tracking sub-issue is #134749. This issue (#84605) remains the “primary” tracking issue for the feature overall. |
@rfcbot cancel As noted in the revert, our FCP on this is now kind of ancient and should be reclarified. Whenever this is later proposed again for stabilization, please nominate the stabilization PR for lang for proper handling. |
@traviscross proposal cancelled. |
Rollup merge of rust-lang#134517 - ehuss:coverage-trait-test, r=Zalathar Add tests for coverage attribute on trait functions This adds tests for the coverage attribute on trait functions. cc rust-lang#84605 (comment)
This issue will track the approval and stabilization of the attribute
coverage
, needed to give developers a way to "hide" a function from the coverage instrumentation enabled byrustc -Z instrument-coverage
.The
Eq
trait in thestd
library implements a marker function that is not meant to be executed, but results in an uncovered region in all rust programs that deriveEq
. This attribute will allow the compiler to skip that function, and remove the uncovered regions.Unresolved questions
The text was updated successfully, but these errors were encountered: