microsoft / AL

Home of the Dynamics 365 Business Central AL Language extension for Visual Studio Code. Used to track issues regarding the latest version of the AL compiler and developer tools available in the Visual Studio Code Marketplace or as part of the AL Developer Preview builds for Dynamics 365 Business Central.
MIT License
744 stars 245 forks source link

[AA0242] Analyzer 'Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads' threw an exception of type 'System.NullReferenceException' #6558

Closed dzzzb closed 3 years ago

dzzzb commented 3 years ago

1. Describe the bug New rule AA0242 doesn't seem to work properly, and throws, which then dumps an error apparently into app.json.

2. To Reproduce I don't know. I just opened a project that was previously reporting no warnings, and got an AL extension update, and now I have 33 of these.

3. Expected behavior The rule should work and not dump exceptions in app.json. I now don't know if I'm incurring JIT loads anywhere, possibly 33 times, or if the analyser is just not working right.

4. Actual behavior

Analyzer 'Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads' threw an exception of type 'System.NullReferenceException' with message 'System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationExtensions.GetSymbol(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationExtensions.cs:line 39
   at Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads.JitLoadDetectionVisitor.VisitFieldAccess(IFieldAccess operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeCop\Design\Rule0242PartialRecordsDetectJitLoads.cs:line 201
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitBinaryOperatorExpression(IBinaryOperatorExpression operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 72
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitIfStatement(IIfStatement operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 121
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArray[T](ImmutableArray`1 list) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 44
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitIfStatement(IIfStatement operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 121
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitIfStatement(IIfStatement operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 121
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArray[T](ImmutableArray`1 list) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 44
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArray[T](ImmutableArray`1 list) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 44
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 36
   at Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads.AnalyzeMethod(OperationAnalysisContext context) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeCop\Design\Rule0242PartialRecordsDetectJitLoads.cs:line 125
   at Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics.AnalyzerExecutor.<>c__DisplayClass53_1.<ExecuteOperationAction>b__1() in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\DiagnosticAnalyzer\AnalyzerExecutor.cs:line 764
   at Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics.AnalyzerExecutor.ExecuteAndCatchIfThrows_NoLock(DiagnosticAnalyzer analyzer, Action analyze, Nullable`1 info) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\DiagnosticAnalyzer\AnalyzerExecutor.cs:line 1100'

5. Versions:

qutreson commented 3 years ago

Does this reproduce consistently? Can you try to isolate a snippet of a code that would reproduce the issue?

BrianThorChristensen commented 3 years ago

I have the same problem with this dataitem on a report:

    dataitem("G/L Entry"; "G/L Entry")
    {
        DataItemTableView = sorting("Global dimension 1 Code", "Posting Date") where("Global Dimension 1 Code" = filter('<>'''''));

        column(Global_Dimension_1_Code; "Global Dimension 1 Code") { }

        trigger OnAfterGetRecord()
        var
            Customer: Record Customer;
            prevAcc: Code[20];
        begin
            Customer.SetLoadFields("No.");
            if Customer.Get('asdf') then begin
                prevAcc := "G/L Entry"."Global Dimension 1 Code"; // <--------------- this line
            end;
        end;
    }

If remove the marked line, the error disappears. If I get the "Global Dimension 1 Code" field from a record variable then the error also disappears.

dzzzb commented 3 years ago

When done where? I have a trivial project here to try to test another bug, that does exactly that, and I don't get any diagnostics reported (correctly or wrongly).

I can try and 'bisect' this at some point, but it'll have to wait until I have less real work to do ;)

dzzzb commented 3 years ago

I have the same problem with this dataitem on a report:

Yes, I have now completed your code and can verify the same error:

I haven't bisected my own code yet. Where is the time... So there might be multiple causes.

Anyway, in this case, it seems that somehow the two records Customer and G/L Entry are mixed up by the AA0242 analyser, such that if we do Customer.SetLoadFields and then access a field from G/L Entry, it throws said exception. Yet if either line is commented out, it doesn't. Weird!

pinging @PhDuck for thoughts

report 50100 Test
{
    UsageCategory = None;

    dataset
    {
        dataitem("G/L Entry"; "G/L Entry")
        {
            column(Global_Dimension_1_Code; "Global Dimension 1 Code")
            {
            }

            trigger OnAfterGetRecord()
            var
                Customer: Record Customer;
            begin
                Customer.SetLoadFields("No.");
                Customer.FindFirst();
                Message("G/L Entry"."Global Dimension 1 Code");
            end;
        }
    }
}
Analyzer 'Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads' threw an exception of type 'System.NullReferenceException' with message 'System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads.JitLoadDetectionVisitor.VisitFieldAccess(IFieldAccess operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeCop\Design\Rule0242PartialRecordsDetectJitLoads.cs:line 192
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundFieldAccess.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Expressions.cs:line 218
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitConversionExpression(IConversionExpression operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 88
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundConversion.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Expressions.cs:line 541
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArgument(IArgument operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 53
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundCall.Argument.Microsoft.Dynamics.Nav.CodeAnalysis.IOperation.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Expressions.cs:line 193
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArray[T](ImmutableArray`1 list) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 44
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitInvocationExpression(IInvocationExpression operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 133
   at Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads.JitLoadDetectionVisitor.VisitInvocationExpression(IInvocationExpression operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeCop\Design\Rule0242PartialRecordsDetectJitLoads.cs:line 217
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundCall.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Expressions.cs:line 161
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitExpressionStatement(IExpressionStatement operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 98
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundExpressionStatement.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Statements.cs:line 98
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitArray[T](ImmutableArray`1 list) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 44
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.VisitBlockStatement(IBlockStatement operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 49
   at Microsoft.Dynamics.Nav.CodeAnalysis.BoundBlock.Accept(OperationVisitor visitor) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\BoundTree\Statements.cs:line 84
   at Microsoft.Dynamics.Nav.CodeAnalysis.OperationWalker.Visit(IOperation operation) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\Compilation\OperationWalker.cs:line 29
   at Microsoft.Dynamics.Nav.CodeCop.Design.Rule0242PartialRecordsDetectJitLoads.AnalyzeMethod(OperationAnalysisContext context) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeCop\Design\Rule0242PartialRecordsDetectJitLoads.cs:line 125
   at Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics.AnalyzerExecutor.<>c__DisplayClass53_1.<ExecuteOperationAction>b__1() in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\DiagnosticAnalyzer\AnalyzerExecutor.cs:line 764
   at Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics.AnalyzerExecutor.ExecuteAndCatchIfThrows_NoLock(DiagnosticAnalyzer analyzer, Action analyze, Nullable`1 info) in D:\a\1\s\source\Prod\Microsoft.Dynamics.Nav.CodeAnalysis\DiagnosticAnalyzer\AnalyzerExecutor.cs:line 1100'
PhDuck commented 3 years ago

Will take a look at this tonight, @atoader please assign it to me.

dzzzb commented 3 years ago

Thanks! 🥳

JesperSchulz commented 3 years ago

The fix for this issue has been checked in to the master branch. It will be available in the bcinsider.azurecr.io/bcsandbox-master Docker image starting from platform build number 24292 and VS Code Extension Version 8.0.446271.

If you don’t have access to these images you need to become part of the Ready2Go program: aka.ms/readytogo

For more details on code branches and docker images please read: https://blogs.msdn.microsoft.com/nav/2018/05/03/al-developer-previews-multiple-releases-and-github/ https://freddysblog.com/2020/06/25/working-with-artifacts/

dzzzb commented 3 years ago

Can this be backported to AL extension 7.1.x in VS Code, please? It's annoying to have to ignore all these warnings, while also wondering if they are failed attempts to report some actual issues. I'm running:

Name: AL Language
Id: ms-dynamics-smb.al
Description: AL development tools for Dynamics 365 Business Central
Version: 7.1.453917
Publisher: Microsoft
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-dynamics-smb.al
dzzzb commented 3 years ago

@PhDuck Do you know if this fix can be backported to AL extension 7.x as delivered through VS Code? My PROBLEMS tab is still spammed by this warning in app.json, which is annoying, and it might even be hiding a legit diagnostic(?)

atoader commented 3 years ago

The fix will be available in the next marketplace update for the VSIX.

dzzzb commented 2 years ago

It lives again...