Примеры ошибок, обнаруженных с помощью диагностики V3125
V3125. The object was used after it was verified against null. Check lines: N1, N2.
Stride
V3125 The 'child' object was used after it was verified against null. VirtualizingTreePanel.cs 430, 429
protected override Size ArrangeOverride(....)
{
....
if (....)
{
for (....)
{
var child = itemsControl.ItemContainerGenerator
.ContainerFromIndex(i) as TreeViewItem;
....
if (child != null)
{
child.Arrange(....);
currentY += child.ActualHeight;
}
....
}
}
else
{
for (....)
{
var child = itemsControl.ItemContainerGenerator
.ContainerFromIndex(i) as UIElement;
child?.Arrange(....);
currentY += child.DesiredSize.Height; // <=
}
}
....
}
Umbraco
V3125 The 'ct' object was used after it was verified against null. Check lines: 171, 163. ContentTypeControllerBase.cs 171
protected TContentType PerformPostSave<....>(....)
{
var ctId = Convert.ToInt32(....);
....
if (ctId > 0 && ct == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
....
if ((....) &&
(ctId == 0 || ct.Alias != contentTypeSave.Alias))
....
}
Similar errors can be found in some other places:
- V3125 The '_repo' object was used after it was verified against null. Check lines: 104, 78. Installer.aspx.cs 104
- V3125 The 'docRequest.RoutingContext.UmbracoContext' object was used after it was verified against null. Check lines: 57, 39. ContentFinderByIdPath.cs 57
- V3125 The 'User' object was used after it was verified against null. Check lines: 90, 80. config.cs 90
- And 5 additional diagnostic messages.
SharpDevelop
V3125 The 'mainAssemblyList' object was used after it was verified against null. Check lines: 304, 291. ClassBrowserPad.cs 304
void UpdateActiveWorkspace()
{
var mainAssemblyList = SD.ClassBrowser.MainAssemblyList;
if ((mainAssemblyList != null) && (activeWorkspace != null)) {
....
}
....
mainAssemblyList.Assemblies.Clear();
....
}
ML.NET
V3125 The 'estimators' object was used after it was verified against null. EstimatorChain.cs 37, 39
private EstimatorChain(...., IEstimator<ITransformer>[] estimators, ....)
{
....
_estimators = estimators ?? new IEstimator<ITransformer>[0]; // <=
....
LastEstimator = estimators.LastOrDefault() as // <=
IEstimator<TLastTransformer>;
_needCacheAfter = needCacheAfter ?? new bool[0];
....
}
ML.NET
V3125 The '_instanceWeights' object was used after it was verified against null. InternalQuantileRegressionTree.cs 81, 74
private void LoadSampledLabels(....)
{
....
Contracts.Check(_instanceWeights == null || ....);
if (....)
{
for (....)
{
....
weights[k] = (float)_instanceWeights[j];
}
}
....
}
ML.NET
V3125 The 'srcColType' object was used after it was verified against null. Check lines: 843, 842. LdaTransform.cs 842, 843
private static List<....> Train(....)
{
....
for (int i = 0; i < columns.Length; i++)
{
....
var srcColType = inputSchema[srcCol].Type as VectorDataViewType;
if (srcColType == null || ....) // <=
throw env.ExceptSchemaMismatch(...., srcColType.ToString()); // <=
....
}
....
}
ML.NET
V3125 The 'calibrated' object was used after it was verified against null. TreeEnsembleCombiner.cs 54, 58, 59
IPredictor IModelCombiner.CombineModels(....)
{
....
foreach (var model in models)
{
....
var calibrated = predictor as IWeaklyTypedCalibratedModelParameters;
....
if (calibrated != null)
_host.Check(....);
predictor = calibrated.WeaklyTypedSubModel; // <=
paramA = -((PlattCalibrator)calibrated.WeaklyTypedCalibrator).Slope; // <=
....
foreach (var t in tree.TrainedEnsemble.Trees)
{
....
if (modelCount == 1)
{
binaryClassifier = calibrated != null;
....
}
else
{
_host.Check((calibrated != null) == binaryClassifier, ....);
....
}
}
....
}
}
Media Portal 2
V3125 The 'root' object was used after it was verified against null. Check lines: 103, 98. SettingsFileHandler.cs 103
protected XmlElement GetPropertyElement(....)
{
XmlElement root = _document.DocumentElement;
if (root == null)
if (!createIfNotExists)
return null;
else
CreateRootElement();
XmlElement entryElement = root.SelectSingleNode( // <=
"Property[@Name=\"" + entryName + "\"]") as XmlElement;
....
}
Similar errors can be found in some other places:
- V3125 The 'e.Error' object was used after it was verified against null. Check lines: 467, 465. TextureAssetCore.cs 467
PascalABC.NET
V3125 The 'resources' object was used after it was verified against null. Check lines: 215, 211. VisualPascalABCNET DesignerResourceService.cs 215
public System.Resources.IResourceReader
GetResourceReader(System.Globalization.CultureInfo info)
{
....
if (resources != null && resources.ContainsKey(info.Name)) {
resourceStorage = resources[info.Name];
} else {
resourceStorage = new ResourceStorage();
resources[info.Name] = resourceStorage; // <=
}
....
}
Similar errors can be found in some other places:
- V3125 The 'this._grid' object was used after it was verified against null. Check lines: 751, 746. VisualPascalABCNET TreeGridNode.cs 751
- V3125 The 'this._grid' object was used after it was verified against null. Check lines: 774, 770. VisualPascalABCNET TreeGridNode.cs 774
- V3125 The 'node.Parent' object was used after it was verified against null. Check lines: 369, 350. VisualPascalABCNET TreeGridView.cs 369
- And 7 additional diagnostic messages.
Unity C# reference source code
V3125 CWE-476 The 'camera' object was used after it was verified against null. Check lines: 184, 180. ARBackgroundRenderer.cs 184
protected void DisableARBackgroundRendering()
{
....
if (camera != null)
camera.clearFlags = m_CameraClearFlags;
// Command buffer
camera.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque,
m_CommandBuffer);
camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer,
m_CommandBuffer);
}
Unity C# reference source code
V3125 CWE-476 The 'item' object was used after it was verified against null. Check lines: 88, 85. TreeViewForAudioMixerGroups.cs 88
protected override Texture GetIconForItem(TreeViewItem item)
{
if (item != null && item.icon != null)
return item.icon;
if (item.id == kNoneItemID) // <=
return k_AudioListenerIcon;
return k_AudioGroupIcon;
}
Similar errors can be found in some other places:
- V3125 CWE-476 The 'element' object was used after it was verified against null. Check lines: 132, 107. StyleContext.cs 132
- V3125 CWE-476 The 'mi.DeclaringType' object was used after it was verified against null. Check lines: 68, 49. AttributeHelper.cs 68
- V3125 CWE-476 The 'label' object was used after it was verified against null. Check lines: 5016, 4999. EditorGUI.cs 5016
- And 7 additional diagnostic messages.
AWS SDK for .NET
V3125 [CWE-476] The 'state' object was used after it was verified against null. Check lines: 139, 127. AWSSDK.Core.Net45 RefreshingAWSCredentials.cs 139
private void UpdateToGeneratedCredentials(
CredentialsRefreshState state)
{
string errorMessage;
if (ShouldUpdate)
{
....
if (state == null)
errorMessage = "Unable to generate temporary credentials";
else
....
throw new AmazonClientException(errorMessage);
}
state.Expiration -= PreemptExpiryTime; // <=
....
}
Similar errors can be found in some other places:
- V3125 [CWE-476] The 'wrappedRequest.Content' object was used after it was verified against null. Check lines: 395, 383. AWSSDK.Core.Net45 HttpHandler.cs 395
- V3125 [CWE-476] The 'datasetUpdates' object was used after it was verified against null. Check lines: 477, 437. AWSSDK.CognitoSync.Net45 Dataset.cs 477
- V3125 [CWE-476] The 'cORSConfigurationCORSConfigurationcORSRulesListValue' object was used after it was verified against null. Check lines: 125, 111. AWSSDK.S3.Net45 PutCORSConfigurationRequestMarshaller.cs 125
- And 2 additional diagnostic messages.
.NET Core Libraries (CoreFX)
V3125 The '_table' object was used after it was verified against null. Check lines: 437, 423. ConstraintCollection.cs 437
public void Clear()
{
if (_table != null)
....
if (_table.fInitInProgress && _delayLoadingConstraints != null)
....
....
}
.NET Core Libraries (CoreFX)
V3125 The 'genericParameterConstraints' object was used after it was verified against null. Check lines: 603, 589. GenericSpecializationPartCreationInfo.cs 603
public static bool CanSpecialize(....)
{
....
object[] genericParameterConstraints = ....;
GenericParameterAttributes[] genericParameterAttributes = ....;
if ((genericParameterConstraints == null) &&
(genericParameterAttributes == null))
{
return true;
}
if ((genericParameterConstraints != null) &&
(genericParameterConstraints.Length != partArity))
{
return false;
}
if ((genericParameterAttributes != null) &&
(genericParameterAttributes.Length != partArity))
{
return false;
}
for (int i = 0; i < partArity; i++)
{
if (!GenericServices.CanSpecialize(
specialization[i],
(genericParameterConstraints[i] as Type[]).
CreateTypeSpecializations(specialization),
genericParameterAttributes[i]))
{
return false;
}
}
return true;
}
Similar errors can be found in some other places:
- V3125 The 'genericParameterAttributes' object was used after it was verified against null. Check lines: 604, 594. GenericSpecializationPartCreationInfo.cs 604
.NET Core Libraries (CoreFX)
V3125 The 'entry' object was used after it was verified against null. Check lines: 270, 227. FtpControlStream.cs 270
protected override PipelineInstruction PipelineCallback(
PipelineEntry entry, ResponseDescription response, ....)
{
if (NetEventSource.IsEnabled)
NetEventSource.Info(this,
$"Command:{entry?.Command} Description:{response?.StatusDescription}");
....
if (entry.Command == "OPTS utf8 on\r\n")
....
....
}
.NET Core Libraries (CoreFX)
V3125 The 'ours' object was used after it was verified against null. Check lines: 1212, 1204. ImmutableArray_1.cs 1212
bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
{
var self = this;
Array otherArray = other as Array;
if (otherArray == null)
{
var theirs = other as IImmutableArray;
if (theirs != null)
{
otherArray = theirs.Array;
if (self.array == null && otherArray == null) // <=
{
return true;
}
else if (self.array == null) // <=
{
return false;
}
}
}
IStructuralEquatable ours = self.array; // <=
return ours.Equals(otherArray, comparer); // <=
}
Similar errors can be found in some other places:
- V3125 The 'ours' object was used after it was verified against null. Check lines: 1265, 1251. ImmutableArray_1.cs 1265
.NET Core Libraries (CoreFX)
V3125 The 'n' object was used after it was verified against null. Check lines: 115, 111. CorrelationManager.cs 115
public override object Pop()
{
StackNode n = _stack.Value;
if (n == null) // <=
{
base.Pop();
}
_stack.Value = n.Prev; // <=
return n.Value;
}
Roslyn Analyzers
V3125 The 'valueClauseName' object was used after it was verified against null. Check lines: 2320, 2318. DiagnosticAnalyzer.cs 2320
private SuppDiagReturnSymbolInfo SuppDiagReturnSymbol(....)
{
....
var valueClauseName = valueClauseMemberAccess.Name as IdentifierNameSyntax;
if (valueClauseName == null
|| valueClauseName.Identifier.Text != "Create")
{
ReportDiagnostic(context,
SuppDiagReturnValueRule,
valueClauseName.GetLocation(), // <=
propertyDeclaration.Identifier.Text);
return result;
}
....
}
Roslyn Analyzers
V3125 The 'ifStatement' object was used after it was verified against null. Check lines: 788, 773. CodeFixProvider.cs 788
private async Task<Document> TriviaCountIncorrectAsync(
MethodDeclarationSyntax declaration)
{
SyntaxGenerator generator = SyntaxGenerator.GetGenerator(document);
....
var ifStatement = declaration.Body.Statements[2] as IfStatementSyntax;
if (ifStatement != null)
{
....
}
....
var oldBlock = ifStatement.Statement as BlockSyntax;
....
}
Azure PowerShell
V3125 The 'startTime' object was used after it was verified against null. Check lines: 1752, 1738. AutomationPSClientDSC.cs 1752
private string GetNodeReportListFilterString(
....,
DateTimeOffset? startTime,
....,
DateTimeOffset? lastModifiedTime)
{
....
if (startTime.HasValue)
{
odataFilter.Add("properties/startTime ge " +
this.FormatDateTime(startTime.Value)); // <=
}
....
if (lastModifiedTime.HasValue)
{
odataFilter.Add("properties/lastModifiedTime ge " +
this.FormatDateTime(startTime.Value)); // <=
}
....
}
Similar errors can be found in some other places:
- V3125 The 'firstPage' object was used after it was verified against null. Check lines: 113, 108. IntegrationAccountAgreementOperations.cs 113
Telerik UI for UWP
V3125 The 'CurrentAttachedMenu' object was used after it was verified against null. Check lines: 98, 96. PopupService.cs 98
private static void Overlay_PointerPressed(....)
{
if (CurrentAttachedMenu == null ||
!CurrentAttachedMenu.hitTestService
.HitTest(e.GetCurrentPoint(CurrentAttachedMenu)
.Position)
.Any())
{
CurrentAttachedMenu.IsOpen = false;
HideOverlay();
}
}
Azure SDK for .NET
V3125 The 'omPropertyData' object was used after it was verified against null. Check lines: 156, 148. CodeGenerationUtilities.cs 156
private static string GetProtocolCollectionToObjectModelCollectionString(
...., PropertyData omPropertyData, ....)
{
if (IsMappedEnumPair(omPropertyData?.GenericTypeParameter, ....))
{
....
}
if (IsTypeComplex(omPropertyData.GenericTypeParameter))
....
}
Azure SDK for .NET
V3125 The 'session' object was used after it was verified against null. Check lines: 69, 68. AmqpLinkCreator.cs 69
public async Task<Tuple<AmqpObject, DateTime>> CreateAndOpenAmqpLinkAsync()
{
....
AmqpSession session = null;
try
{
// Create Session
....
session = amqpConnection.CreateSession(amqpSessionSettings);
await session.OpenAsync(....).ConfigureAwait(false);
}
catch (Exception exception)
{
....
session?.Abort();
throw AmqpExceptionHelper.GetClientException(exception, null,
session.GetInnerException(), amqpConnection.IsClosing());
}
....
}
RavenDB
V3125 The 'item' object was used after it was verified against null. Check lines: 249, 247. ActiveTransactions.cs(249), ActiveTransactions.cs(247) Voron
public long ScanOldest()
{
....
for (int i = 0; i < copy.Length; i++)
{
var item = copy[i].Value;
if (item != null || item == InvalidLowLevelTransaction) // <=
{
if (val > item.Id) // <=
val = item.Id;
}
}
....
}
OpenRA
V3125 The 'logo' object was used after it was verified against null. Check lines: 236, 222. ConnectionLogic.cs 236
public ConnectionSwitchModLogic(....)
{
....
var logo = panel.GetOrNull<RGBASpriteWidget>("MOD_ICON");
if (logo != null)
{
logo.GetSprite = () =>
{
....
};
}
if (logo != null && mod.Icon == null) // <=
{
// Hide the logo and center just the text
if (title != null)
title.Bounds.X = logo.Bounds.Left;
if (version != null)
version.Bounds.X = logo.Bounds.X;
width -= logo.Bounds.Width;
}
else
{
// Add an equal logo margin on the right of the text
width += logo.Bounds.Width; // <=
}
....
}
Ryujinx
V3125 The 'Owner' object was used after it was verified against null. Check lines: 1084, 1082. KThread.cs 1084
private void FreeResources()
{
Owner?.RemoveThread(this);
if (_tlsAddress != 0 &&
Owner.FreeThreadLocalStorage(_tlsAddress) != KernelResult.Success)
{
....
}
....
}
PeachPie
V3125 The 'context' object was used after it was verified against null. Check lines: 3138, 3133. Hash.cs 3138
static HashPhpResource ValidateHashResource(HashContext context)
{
if (context == null)
{
PhpException.ArgumentNull(nameof(context));
}
return context.HashAlgorithm;
}
Expression "PhpException.ArgumentNull(nameof(context))" doesn't throw an exception actually.
Eto.Forms
V3125 The 'value' object was used after it was verified against null. Check lines: 329, 320. Eto.WinForms(net462) TextBoxHandler.cs 329
public override string Text
{
get { return base.Text; }
set
{
var oldText = Text;
var newText = value ?? string.Empty; // <=
if (newText != oldText)
{
var args = new TextChangingEventArgs(oldText, newText, false);
Callback.OnTextChanging(Widget, args);
if (args.Cancel)
return;
base.Text = value;
if (AutoSelectMode == AutoSelectMode.Never)
Selection = new Range<int>(value.Length, // <=
value.Length - 1); // <=
}
}
}
Bitwarden
V3125 The 'sub' object was used after it was verified against null. Check lines: 1554, 1549. StripePaymentService.cs 1554
public async Task<SubscriptionInfo> GetSubscriptionAsync(
ISubscriber subscriber)
{
....
if (!string.IsNullOrWhiteSpace(subscriber.GatewaySubscriptionId))
{
var sub = await _stripeAdapter.SubscriptionGetAsync(
subscriber.GatewaySubscriptionId);
if (sub != null)
{
subscriptionInfo.Subscription =
new SubscriptionInfo.BillingSubscription(sub);
}
if ( !sub.CanceledAt.HasValue
&& !string.IsNullOrWhiteSpace(subscriber.GatewayCustomerId))
{
....
}
}
return subscriptionInfo;
}
Bitwarden
V3125 The 'taxInfo' object was used after it was verified against null. Check lines: 135, 99. StripePaymentService.cs 135
public async Task<string> PurchaseOrganizationAsync(...., TaxInfo taxInfo)
{
....
if (taxInfo != null && // <=
!string.IsNullOrWhiteSpace(taxInfo.BillingAddressCountry) &&
!string.IsNullOrWhiteSpace(taxInfo.BillingAddressPostalCode))
{
....
}
....
Address = new Stripe.AddressOptions
{
Country = taxInfo.BillingAddressCountry, // <=
PostalCode = taxInfo.BillingAddressPostalCode,
Line1 = taxInfo.BillingAddressLine1 ?? string.Empty,
Line2 = taxInfo.BillingAddressLine2,
City = taxInfo.BillingAddressCity,
State = taxInfo.BillingAddressState,
}
....
}
Orleans
V3125 The 'msg' object was used after it was verified against null. Check lines: 275, 269. SiloConnection.cs 275
public void FailMessage(Message msg, string reason)
{
if (msg != null && msg.IsPing()) // <=
{
this.Log.LogWarning("Failed ping message {Message}", msg);
}
MessagingStatisticsGroup.OnFailedSentMessage(msg);
if (msg.Direction == Message.Directions.Request) // <=
{
if (this.Log.IsEnabled(LogLevel.Debug)) ....;
this.messageCenter.SendRejection(....);
}
else
{
this.MessagingTrace.OnSiloDropSendingMessage(....);
}
}
Orleans
V3125 The 'table' object was used after it was verified against null. Check lines: 306, 303. LocalReminderService.cs 306
private async Task ReadTableAndStartTimers(IRingRange range,
int rangeSerialNumberCopy)
{
....
try
{
....
ReminderTableData table = await reminderTable.ReadRows(....);
....
if (null == table && reminderTable is MockReminderTable) return; // <=
var remindersNotInTable = ....
if (logger.IsEnabled(LogLevel.Debug))
logger.Debug(...., table.Reminders.Count, ....); // <=
....
}
catch (Exception exc)
{
....
}
}
AvalonStudio
V3125 The 'specialEntry.Value' object was used after it was verified against null. Check lines: 92, 86. GlobalRunSpec.cs 92
public GlobalRunSpec(....)
{
....
if (specialEntry.Value != null)
{
....
}
RunSpec spec = new(specialOps,
specialVariables ?? variables,
specialEntry.Value.VariableSetup.FallbackFormat);
....
}
Discord.NET
V3125 The 'guild' object was used after it was verified against null. Check lines: 76, 62. SocketResolvableData.cs 76
internal SocketResolvableData(DiscordSocketClient discord,
ulong? guildId,
T model)
{
var guild = guildId.HasValue ? discord.GetGuild(guildId.Value) : null;
....
if (resolved.Members.IsSpecified && guild != null) // <=
{
....
var user = guild.AddOrUpdateUser(member.Value);
....
}
if (resolved.Roles.IsSpecified)
{
foreach (var role in resolved.Roles.Value)
{
var socketRole = guild.AddOrUpdateRole(role.Value); // <=
....
}
}
if (resolved.Messages.IsSpecified)
{
foreach (var msg in resolved.Messages.Value)
{
....
if (guild != null) // <=
{
if (msg.Value.WebhookId.IsSpecified)
....
else
author = guild.GetUser(msg.Value.Author.Value.Id);
}
else
....
}
}
....
}
.NET MAUI
V3125 The 'content' object was used after it was verified against null. Check lines: 449, 446. ListView.cs 449
protected override void SetupContent(Cell content, int index)
{
....
if (content != null)
_logicalChildren.Add(content);
content.Parent = this;
VisualDiagnostics.OnChildAdded(this, content);
}
.NET MAUI
V3125 The 'AppShell' object was used after it was verified against null. Check lines: 37, 26. ShellChromeGallery.cs 37
AppShell AppShell => Application.Current.MainPage as AppShell;
public ShellChromeGallery()
{
....
if (AppShell != null)
{
flyoutBehavior.SelectedIndex = ....;
flyoutHeaderBehavior.SelectedIndex = ....;
}
else
{
flyoutBehavior.SelectedIndex = 1;
flyoutHeaderBehavior.SelectedIndex = 0;
}
AppShell.FlyoutBackdrop = SolidColorBrush.Pink; // <=
}
BTCPay Server
V3125 The 'request' object was used after it was verified against null. Check lines: 136, 130. GreenfieldLightningNodeApiController.cs 136
public virtual async Task<IActionResult> OpenChannel(....)
{
var lightningClient = await GetLightningClient(cryptoCode, true);
if (request?.NodeURI is null)
{
ModelState.AddModelError(nameof(request.NodeURI),
"A valid node info was not provided to open a channel with");
}
if (request.ChannelAmount == null)
{
ModelState.AddModelError(nameof(request.ChannelAmount), "....");
}
....
}
if (!ModelState.IsValid) { return this.CreateValidationError(ModelState); }
Ryujinx
V3125 The '_renderer.Window' object was used after it was verified against null. Check lines: 882, 877. AppHost.cs 882
private void RenderLoop()
{
....
_renderer?.Window?.SetAntiAliasing(....);
_renderer?.Window?.SetScalingFilter(....);
_renderer?.Window?.SetScalingFilterLevel(....);
....
_renderer.Window.SetSize(....);
....
}
.NET 8
V3125 The 'stack_instr!' object was used after it was verified against null. Check lines: 1918, 1913. UnreachableBlocksOptimizer.cs 1918
Instruction[]? GetArgumentsOnStack (MethodDefinition method)
{
int length = method.GetMetadataParametersCount ();
Debug.Assert (length != 0);
if (stack_instr?.Count < length)
return null;
var result = new Instruction[length];
while (length != 0)
result[--length] = stack_instr!.Pop (); // <=
return result;
}
nopCommerce
V3125 The 'configuration' object was used after it was verified against null. Check lines: 139, 135. GoogleAuthenticatorController.cs 139
public async Task<....> GoogleAuthenticatorDelete(....)
{
....
//delete configuration
var configuration =
await _googleAuthenticatorService.GetConfigurationByIdAsync(model.Id);
if (configuration != null)
{
await _googleAuthenticatorService
.DeleteConfigurationAsync(configuration);
}
var customer = await _customerService
.GetCustomerByEmailAsync(configuration.Customer) ??
await _customerService
.GetCustomerByUsernameAsync(configuration.Customer);
....
}
TowerDefense-GameFramework-Demo
V3125 The 'towerLevelData' object was used after it was verified against null. Check lines: 122, 117. LevelControl.cs 122
public void ShowPreviewTower(TowerData towerData)
{
....
TowerLevelData towerLevelData = towerData.GetTowerLevelData(0);
if (towerLevelData == null) // <=
{
Log.Error("Tower '{0}' Level '{1}' data is null.", towerData.Name, 0);
}
EntityDataRadiusVisualiser entityDataRadiusVisualiser =
EntityDataRadiusVisualiser.Create(towerLevelData.Range); // <=
....
}
Garnet
V3125 The 'streamWriter' object was used after it was verified against null. Check lines: 95, 89. FileLoggerProvider.cs 95
public void Log<TState>(....)
{
var msg = string.Format("[{0:D3}.{1}] ({2}) <{3}> {4}", ....);
lock (this.lockObj)
{
streamWriter?.WriteLine(msg); // <=
//var now = DateTime.UtcNow;
//if(now - lastFlush > flushInterval)
{
//lastFlush = now;
streamWriter.Flush(); // <=
}
}
}