Skip to content
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

C#: Handle some BMN garbage types. #18894

Merged
merged 9 commits into from
Mar 7, 2025

Conversation

michaelnebel
Copy link
Contributor

@michaelnebel michaelnebel commented Feb 28, 2025

In this PR we categorize some types as unknown types even though they are not considered error types in Roslyn in BMN. An example of this is that in the roslyn project a type named var is introduced. Since all files are crammed into a single compilation all implicitly typed declarations are considered to have type var - which is definitely wrong. Instead we should/can consider the type to be unknown (a better solution is of course to get the type right).

Analysis of DCA results:

nightly/nightly: Only roslyn and mono appears to be affected (these are the projects that has different tuple counts on some of the quality queries). This is not surprising as it are those projects that have broken types defined (for instance a type named var and a type without a name). There doesn't appear to be any performance degredations. Tens of thousands of false positives for the cs/call-to-object-tostring have been removed. Some new false positives have been introduced for some of the other quality queries - most prominently is cs/constant-condition. Improving this again will require further investigation (I think this is due to improper handling of unknown types in isMatchingConstant - will make a follow up PR for that). All this boils down to incorrect typing of expressions and variables. DCA also shows an explosion of expressions in roslyn that doesn't have a type. This is expected as most expressions in roslyn were assigned an incorrect type (either the type var or the type without a name).
nightly/security-extended: No changes in results or performance.

@github-actions github-actions bot added the C# label Feb 28, 2025
@michaelnebel michaelnebel force-pushed the csharp/garbagetypes branch 2 times, most recently from 820737e to c4033f2 Compare February 28, 2025 10:19
@@ -267,7 +267,7 @@ private void Populate(ISymbol? optionalSymbol, Entities.CachedEntity entity)

bool duplicationGuard, deferred;

if (ExtractionContext.Mode is ExtractorMode.Standalone)
if (ExtractionContext.IsStandalone)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note, that this is not semantically equivalent! But the original code looks like a mistake.

@michaelnebel michaelnebel force-pushed the csharp/garbagetypes branch 3 times, most recently from 3c5e02f to f061860 Compare February 28, 2025 14:41
@michaelnebel michaelnebel force-pushed the csharp/garbagetypes branch from 65225b3 to 6f80c56 Compare March 5, 2025 08:05
@michaelnebel michaelnebel added the no-change-note-required This PR does not need a change note label Mar 5, 2025
@michaelnebel michaelnebel force-pushed the csharp/garbagetypes branch from 6f80c56 to 5c931fa Compare March 5, 2025 08:54
@michaelnebel michaelnebel marked this pull request as ready for review March 5, 2025 09:35
@michaelnebel michaelnebel requested a review from a team as a code owner March 5, 2025 09:35
// (1) public class { ... } is a broken type as it doesn't have a name.
// (2) public class var { ... } is an allowed type, but it overrides the `var` keyword for all uses.
// It is probably a better heuristic to treat it as a broken type.
return string.IsNullOrEmpty(symbol.Name) || symbol.Name == "var";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there other names that should be treated the same way? For example dynamic, nint, nuint?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we can definitely extend the list with more "reserved" names.

@@ -15,6 +15,7 @@ public class ExtractionContext
public ExtractorMode Mode { get; }
public string OutputPath { get; }
public IEnumerable<CompilationInfo> CompilationInfos { get; }
public bool IsStandalone => Mode.HasFlag(ExtractorMode.Standalone);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need a public Mode property? Can it be made private?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it the value itself is written to trap outside this file (it is written to file_extraction_mode).

@michaelnebel
Copy link
Contributor Author

Will run DCA one more time.

@michaelnebel
Copy link
Contributor Author

No further comments on the latest DCA run compared to the previous ones.

@michaelnebel michaelnebel merged commit 82b7a19 into github:main Mar 7, 2025
19 checks passed
@michaelnebel michaelnebel deleted the csharp/garbagetypes branch March 7, 2025 08:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C# no-change-note-required This PR does not need a change note
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants