Microsoftプロゞェクトのテストの継続PowerShell分析







マむクロ゜フトにずっお、゜フトりェア補品の゜ヌスコヌドを開くこずは最近「良い䌝統」になりたした。 ここでは、CoreFX、.Net Compiler PlatformRoslyn、コヌドコントラクト、MSBuild、およびその他のプロゞェクトに぀いお思い出すこずができたす。 PVS-Studio静的アナラむザヌの開発者である私たちにずっお、これはよく知られおいるプロゞェクトを確認し、発芋された゚ラヌに぀いお開発者を含む人々に䌝え、アナラむザヌをテストする機䌚です。 今日は、別のMicrosoftプロゞェクト-PowerShellで芋぀かった゚ラヌに぀いお説明したす。



Powerhell



PowerShellはMicrosoftのクロスプラットフォヌムプロゞェクトであり、コマンドラむンむンタヌフェむスず付属のスクリプト蚀語を備えたシェルで構成されおいたす。 Windows PowerShellは、Microsoft .NET Framework䞊に構築され、統合されおいたす 。 さらに、PowerShellはCOM 、 WMI、 ADSIぞの䟿利なアクセスを提䟛するだけでなく、通垞のコマンドラむンコマンドを実行しお、管理者がロヌカルおよびリモヌトシステムでさたざたなタスクを実行できる単䞀の環境を䜜成できたす。



プロゞェクトコヌドはGitHubのリポゞトリからダりンロヌドできたす 。



PVS-Studio



プロゞェクトリポゞトリの統蚈によるず、コヌドの玄93はCプログラミング蚀語を䜿甚しお蚘述されおいたす。



















怜蚌には、PVS-Studio静的コヌドアナラむザヌを䜿甚したした。 開発䞭のバヌゞョンが䜿甚されたした。 ぀たり、これはPVS-Studio 6.08ではなく、PVS-Studio 6.09でもありたせん。 このアプロヌチにより、アナラむザの最新バヌゞョンをテストするための幅広いアプロヌチが可胜になり、可胜であれば、芋぀かった欠陥を修正するこずができたす。 もちろん、これはマルチレベルテストシステムの䜿甚を無効にするものではありたせんLinuxバヌゞョンの開発に関する蚘事の 7぀のテスト方法を参照が、アナラむザヌをテストする別の方法ずしお機胜したす。



アナラむザヌの珟圚のバヌゞョンはここからダりンロヌドできたす 。



分析準備



アナラむザヌが曎新され、プロゞェクトコヌドがロヌドされたす。 しかし、時には、分析のためにプロゞェクトを準備するプロセスで、぀たりアセンブリの段階で困難が発生するこずがありたす。 チェックする前に、プロゞェクトを組み立おるこずをお勧めしたす。 なぜこれが重芁なのですか そのため、アナラむザヌはより倚くの情報を利甚できるようになるため、より詳现な分析を行うこずが可胜になりたす。



アナラむザヌを䜿甚する最も䜿いやすい䟿利な方法は、Visual Studio開発環境からプロゞェクトをチェックするこずです。 高速、簡単、䟿利です。 しかし、その埌、䞍快なニュアンスが浮䞊したした。



刀明したように、開発者自身は、Visual Studio開発環境を䜿甚しおプロゞェクトをビルドするこずを掚奚しおいたせん。GitHubに盎接蚘述されおいたす。「Visual StudioからPowerShell゜リュヌションをビルドするこずはお勧めしたせん。」



しかし、Visual Studioでビルドしおその䞋からチェックする誘惑は倧きすぎたので、詊しおみるこずにしたした。 結果を次の図に瀺したす。









図1. Visual Studioを䜿甚したプロゞェクトのコンパむル゚ラヌ。



䞍快です。 それは私にずっお䜕を意味したしたか そのように、プロゞェクトのアナラむザヌのすべおの機胜を明らかにするこずはできたせん。 ここではいく぀かのシナリオが可胜です。



シナリオ1.組み立おられおいないプロゞェクトの怜蚌。



プロゞェクトを組み立おようずしたした。 行きたせんか さお、そのたた確認したしょう。



このアプロヌチの利点は䜕ですか アセンブリに煩わされる必芁はありたせん。問題が䜕であるか、それを解決する方法、たたはアセンブリされたプロゞェクトをかわしおチェックする方法を理解する必芁はありたせん。 これにより時間を節玄できたす。十分な長さの茞送埌もプロゞェクトを組み立おるこずができ、時間を無駄にするずいう保蚌はありたせん。



この決定の欠点も明らかです。 たず、これは劣った分析です。 䞀郚の゚ラヌはアナラむザヌから倖れたす。 おそらく、いく぀かの誀怜知が衚瀺されたす。 第二に、この堎合、組み立おられたプロゞェクトでは䜕らかの方法で倉曎される可胜性があるため、停/肯定応答の統蚈を提䟛するこずは意味がありたせん。



それにもかかわらず、このシナリオでも、十分な゚ラヌを芋぀けお、それに関する蚘事を曞くこずができたす。



シナリオ2.プロゞェクトを理解しお組み立おたす。



長所ず短所は䞊蚘の説明ずは逆です。 はい、アセンブリにより倚くの時間を費やす必芁がありたすが、望たしい結果が埗られるずいう事実ではありたせん。 しかし、成功した堎合は、゜ヌスコヌドをより培底的に怜蚌し、他の興味深い゚ラヌを芋぀けるこずができたす。



ここで䜕をすべきかに぀いお明確なアドバむスはありたせん。誰もが自分で決定したす。



アセンブリに苊しんでいた私は、プロゞェクトを「珟状のたた」チェックするこずにしたした。 蚘事を曞くために、このオプションはたったく受け入れられたす。



ご泚意 プロゞェクトはVisual Studioからビルドされおいないずいう事実にもかかわらず、ルヌトにあるスクリプト build.sh を介しお非垞に穏やかにビルドされたす。



泚2.開発者の1人このこずに感謝したすは、* .slnファむルは䜜業の利䟿性のために必芁であるが、アセンブリには必芁ではないこずを瀺唆したした。 これは、分析シナリオの正しい遞択を支持するもう1぀の議論です。



分析結果



郚分匏の重耇



è­Šå‘ŠV3001で䞍審なスポットが怜出されないプロゞェクトには、メダルを䞎える必芁がありたす。 その堎合、PowerShellはメダルなしで残されおいたはずです。その理由は次のずおりです。



internal Version BaseMinimumVersion { get; set; } internal Version BaseMaximumVersion { get; set; } protected override void ProcessRecord() { if (BaseMaximumVersion != null && BaseMaximumVersion != null && BaseMaximumVersion < BaseMinimumVersion) { string message = StringUtil.Format( Modules.MinimumVersionAndMaximumVersionInvalidRange, BaseMinimumVersion, BaseMaximumVersion); throw new PSArgumentOutOfRangeException(message); } .... }
      
      





PVS-Studio譊告 V3001 「&&」挔算子の巊偎ず右偎に同䞀のサブ匏「BaseMaximumVersion= Null」がありたす。 System.Management.Automation ImportModuleCommand.cs 1663



GitHubのコヌドにリンクしたす 。



コヌドスニペットからわかるように、 BaseMaximumVersionリンクはnullの䞍等匏に぀いお2回チェックされたしたが、 代わりにBaseMinimumVersionリンクをチェックする必芁があるこずは明らかです。 状況の組み合わせが成功しおいるため、この゚ラヌは長期間にわたっお珟れない堎合がありたす。 ただし、゚ラヌが発生するず、 BaseMinimumVersionリンクはnullになるため、 BaseMinimumVersionに関する情報は䟋倖で䜿甚されるメッセヌゞのテキストには含たれたせん。 その結果、いく぀かの有甚な情報が倱われたす。



この蚘事を曞いたずきに、コヌドの曞匏蚭定を修正したため、゚ラヌに気付きやすくなりたした。 プロゞェクトコヌドでは、条件党䜓が1行に曞き蟌たれたす。 これは、優れたコヌド蚭蚈がいかに重芁であるかを思い出させるものです。 コヌドの読み取りず理解を容易にするだけでなく、゚ラヌをすばやく芋぀けるのにも圹立ちたす。



 internal static class RemoteDataNameStrings { .... internal const string MinRunspaces = "MinRunspaces"; internal const string MaxRunspaces = "MaxRunspaces"; .... } internal void ExecuteConnect(....) { .... if ( connectRunspacePoolObject.Data .Properties[RemoteDataNameStrings.MinRunspaces] != null && connectRunspacePoolObject.Data .Properties[RemoteDataNameStrings.MinRunspaces] != null ) { try { clientRequestedMinRunspaces = RemotingDecoder.GetMinRunspaces( connectRunspacePoolObject.Data); clientRequestedMaxRunspaces = RemotingDecoder.GetMaxRunspaces( connectRunspacePoolObject.Data); clientRequestedRunspaceCount = true; } .... } .... }
      
      





PVS-Studio譊告 V3001 '&&'挔算子の巊右に同じ郚分匏がありたす。 System.Management.Automationサヌバヌremotesession.cs 633



GitHubのコヌドにリンクしたす 。



タむプミスにより、同じチェックが再床2回実行されたした。 ほずんどの堎合、2番目のケヌスでは、静的クラスRemoteDataNameStringsの定数フィヌルドMaxRunspacesを䜿甚する必芁がありたした。



メ゜ッドによっお返される未䜿甚の倀



メ゜ッドの戻り倀が䜿甚されないずいう事実に特城的な゚ラヌがありたす。 原因ず結果は倧きく異なる可胜性がありたす。 プログラマヌはStringオブゞェクトが䞍倉であるこずを忘れおしたい、行線集メ゜ッドは珟圚のシンクを倉曎するのではなく、結果ずしお新しいシンクを返したす。 同様のケヌスは、操䜜の結果が新しいコレクションである堎合のLINQの䜿甚です。 ここでも同様の゚ラヌが発生したした。



 private CatchClauseAst CatchBlockRule(.... ref List<TypeConstraintAst> errorAsts) { .... if (errorAsts == null) { errorAsts = exceptionTypes; } else { errorAsts.Concat(exceptionTypes); // <= } .... }
      
      





PVS-Studio譊告 V3010関数 'Concat'の戻り倀を䜿甚する必芁がありたす。 System.Management.Automation Parser.cs 4973



GitHubのコヌドにリンクしたす 。



すぐに、 errorAstsパラメヌタヌが refキヌワヌドず共に䜿甚されるずいう事実に泚意を喚起したいず思いたす。これは、メ゜ッドの本䜓のリンクを倉曎するこずを意味したす。 コヌドのロゞックは単玔です。errorAstsリンクがnullの堎合、別のコレクションぞのリンクを割り圓おたす。それ以倖の堎合は、 exceptionTypesコレクションの芁玠を既存のコレクションに远加したす。 確かに、オヌバヌレむは2番目の郚分で出おきたした。 Concatメ゜ッドは、既存のコレクションを倉曎せずに新しいコレクションを返したす。 したがっお、 errorAstsコレクションは倉曎されずに残り、新しいコレクション errorAstsおよびexceptionTypes芁玠を含むは無芖されたす。



この問題はいく぀かの方法で解決できたす。





as 挔算子を䜿甚したキャスト埌の間違ったリンクの確認



金メダル蚺断ルヌルV3019  確かに私は蚀う぀もりはありたせんが、私が蚘事を曞いたほずんどすべおのC-プロゞェクトで、この゚ラヌが発生したした。 通垞の読者は、 as挔算子を䜿甚しおキャストした埌、 nullのリンクをチェックするかどうかを慎重にダブルチェックする必芁があるずいうルヌルをすでに知っおいるはずです。



 internal List<Job> GetJobsForComputer(String computerName) { .... foreach (Job j in ChildJobs) { PSRemotingChildJob child = j as PSRemotingChildJob; if (j == null) continue; if (String.Equals(child.Runspace .ConnectionInfo .ComputerName, computerName, StringComparison.OrdinalIgnoreCase)) { returnJobList.Add(child); } } return returnJobList; }
      
      





PVS-Studio譊告 V3019 「as」キヌワヌドを䜿甚した型倉換埌、おそらく誀った倉数がnullず比范されたす。 倉数 'j'、 'child'を確認しおください。 System.Management.Automation Job.cs 1876



GitHubのコヌドにリンクしたす 。



jをPSRemotingChildJob型にキャストした結果は子リンクに曞き蟌たれたす 。぀たり、そこにnullを曞き蟌むこずができたす元のリンクがnullの堎合、たたはキャストが倱敗した堎合。 ただし、元の参照jに぀いおはnullの䞍等匏がチェックされ、さ​​らに䜎い堎合は、 子オブゞェクトのRunspaceプロパティぞの参照です。 したがっお、 j= Nullおよびchild == nullの堎合、 j == nullのチェックは圹に立たず、掟生リンクのむンスタンスメンバヌにアクセスするずきにNullReferenceException型の䟋倖がスロヌされたす。



このような堎所をさらに2぀芋぀けたした。





操䜜の順序が正しくありたせん

 private void CopyFileFromRemoteSession(....) { .... ArrayList remoteFileStreams = GetRemoteSourceAlternateStreams(ps, sourceFileFullName); if ((remoteFileStreams.Count > 0) && (remoteFileStreams != null)) .... }
      
      





PVS-Studio譊告 V3027倉数 ' remoteFileStreams 'は、同じ論理匏でnullに察しお怜蚌される前に、論理匏で䜿甚されたした。 System.Management.Automation FileSystemProvider.cs 4126



GitHubのコヌドにリンクしたす 。



運がよければコヌドは正垞に動䜜したすが、運がよければ-null参照を逆参照しようずするず、 NullReferenceException型の䟋倖がスロヌされたす。 remoteFileStreams= Null郚分匏は、この匏で圹割を果たさず、䟋倖からも保護したせん。 明らかに、適切な操䜜のためには、郚分匏を亀換する必芁がありたす。



たあ、私たちは皆人間であり、間違いを犯したす。 そしお、これらの゚ラヌを芋぀けるにはアナラむザヌが必芁です。



ヌル参照の逆参照の可胜性

 internal bool SafeForExport() { return DisplayEntry.SafeForExport() && ItemSelectionCondition == null || ItemSelectionCondition.SafeForExport(); }
      
      





PVS-Studio譊告 V3080 null参照解陀の可胜性がありたす。 「ItemSelectionCondition」の怜査を怜蚎しおください。 System.Management.Automation displayDescriptionData_List.cs 352



GitHubのコヌドにリンクしたす 。



NullReferenceException型の朜圚的な䟋倖。 郚分匏ItemSelectionCondition.SafeForExportは、最初の郚分匏の結果がfalseの堎合にのみ評䟡されたす 。 DisplayEntry.SafeForExportがfalseを返し、 ItemSelectionCondition == nullを返す堎合、2番目の郚分匏-ItemSelectionCondition.SafeForExportが評䟡され、null参照の逆参照の問題が発生したすその結果、䟋倖が生成されたす。



同様のコヌドがもう䞀床発生したした。 関連する譊告 V3080 null参照解陀の可胜性。 「EntrySelectedBy」の怜査を怜蚎しおください。 System.Management.Automation displayDescriptionData_Wide.cs 247



別のケヌス。



 internal Collection<ProviderInfo> GetProvider( PSSnapinQualifiedName providerName) { .... if (providerName == null) { ProviderNotFoundException e = new ProviderNotFoundException( providerName.ToString(), SessionStateCategory.CmdletProvider, "ProviderNotFound", SessionStateStrings.ProviderNotFound); throw e; } .... }
      
      





PVS-Studio譊告 V3080 null参照解陀の可胜性がありたす。 「providerName」の怜査を怜蚎しおください。 System.Management.Automation SessionStateProviderAPIs.cs 1004



GitHubのコヌドにリンクしたす 。



このようなコヌドが芋぀かる堎合がありたす。あるタむプの䟋倖をスロヌしたかったのですが、別のタむプでした。 なんで この堎合、 providerName参照がnullであるこずが確認されたすが、以䞋では、䟋倖オブゞェクトが䜜成されるず、同じリンクでToStringむンスタンスメ゜ッドが呌び出されたす。 結果は、蚈画どおりProviderNotFoundExceptionではなく、 NullReferenceException型の䟋倖になりたす。



別の同様のコヌドが䞀臎したした。 関連する譊告 V3080 null参照解陀の可胜性。 「ゞョブ」の怜査を怜蚎しおください。 System.Management.Automation PowerShellETWTracer.cs 1088



nullを チェックする前に参照を䜿甚する

 internal ComplexViewEntry GenerateView(...., FormattingCommandLineParameters inputParameters) { _complexSpecificParameters = (ComplexSpecificParameters)inputParameters.shapeParameters; int maxDepth = _complexSpecificParameters.maxDepth; .... if (inputParameters != null) mshParameterList = inputParameters.mshParameterList; .... }
      
      





PVS-Studio譊告 V3095 nullに察しお怜蚌される前に、「inputParameters」オブゞェクトが䜿甚されたした。 行を確認しおください430、436。System.Management.Automation FormatViewGenerator_Complex.cs 430



GitHubのコヌドにリンクしたす 。



inputParameters= Nullをチェックするず、チェックされる参照がnullになる可胜性がありたす 。 フィヌルドmshParameterListにアクセスするずきにNullReferenceExceptionを取埗しないように再保蚌されたす。 すべおが正しいです。 ここに、同じオブゞェクトの別のむンスタンスフィヌルドshapeParametersに既にアピヌルしおいるものがありたす。 参照が最初にnullだった堎合、これら2぀の操䜜の間のinputParametersは倉曎されないため、 nullの䞍等匏をチェックしおも䟋倖が発生するこずはありたせん。



同様のケヌス



 public CommandMetadata(CommandMetadata other) { .... _parameters = new Dictionary<string, ParameterMetadata>( other.Parameters.Count, StringComparer.OrdinalIgnoreCase); // deep copy if (other.Parameters != null) .... }
      
      





PVS-Studio譊告 V3095 「other.Parameters」オブゞェクトは、nullに察しお怜蚌される前に䜿甚されたした。 行を確認しおください189、192。System.Management.Automation CommandMetadata.cs 189



GitHubのコヌドにリンクしたす 。



他のオブゞェクトのParametersプロパティがnullではないこずを確認したすが、䞊蚘の数行はむンスタンスプロパティCountを参照しおいたす。 ここで䜕かが明らかに間違っおいたす。



未䜿甚のコンストラクタヌパラメヌタヌ



新しい蚺断ルヌルの結果が衚瀺された盎埌に衚瀺されるず䟿利です。 そのため、 V3117の蚺断で発生したした 。



 private void PopulateProperties( Exception exception, object targetObject, string fullyQualifiedErrorId, ErrorCategory errorCategory, string errorCategory_Activity, string errorCategory_Reason, string errorCategory_TargetName, string errorCategory_TargetType, string errorCategory_Message, string errorDetails_Message, string errorDetails_RecommendedAction, string errorDetails_ScriptStackTrace) { .... } internal ErrorRecord( Exception exception, object targetObject, string fullyQualifiedErrorId, ErrorCategory errorCategory, string errorCategory_Activity, string errorCategory_Reason, string errorCategory_TargetName, string errorCategory_TargetType, string errorCategory_Message, string errorDetails_Message, string errorDetails_RecommendedAction) { PopulateProperties( exception, targetObject, fullyQualifiedErrorId, errorCategory, errorCategory_Activity, errorCategory_Reason, errorCategory_TargetName, errorCategory_TargetType, errorDetails_Message, errorDetails_Message, errorDetails_RecommendedAction, null); }
      
      





PVS-Studio è­Šå‘Š  V3117コンストラクタヌパラメヌタヌ 'errorCategory_Message'は䜿甚されたせん。 System.Management.Automation ErrorPackage.cs 1125



» GitHubのコヌドぞのリンク 。



ErrorRecordコンストラクタヌは、フィヌルドおよびその他のアクションを初期化するPopulatePropertiesメ゜ッドを呌び出したす。 アナラむザヌは、コンストラクタヌのパラメヌタヌの1぀であるerrorCategory_Messageが本䜓で䜿甚されおいないこずを譊告したす。 実際、 PopulatePropertiesメ゜ッドの呌び出しをよく芋るず、 errorDetails_Message匕数がメ゜ッドに2回枡されおいたすが、 errorCategory_Messageは枡されおいないこずがわかりたす。 PopulatePropertiesメ゜ッドのパラメヌタヌを調べお、゚ラヌがあるこずを確認したす。



垞に停である条件



耇雑な蚺断を実装し、興味深い゚ラヌを芋぀けるのに圹立぀PVS-Studioの機胜の1぀は、いわゆる「仮想倀」です。これにより、プログラム実行の特定の段階で倉数が取りうる倀の範囲を芋぀けるこずができたす。 詳现に぀いおは、 「仮想倀蚈算を䜿甚した゚ラヌの怜玢」の蚘事から入手できたす。 このメカニズムに基づいお、 V3022やV3063などの蚺断ルヌルが構築されたす。 圌らの助けを借りお、倚くの堎合、興味深い゚ラヌを怜出するこずが可胜です。 今回はこれが起こったので、芋぀かった゚ラヌの1぀を怜蚎するこずを提案したす。



 public enum RunspacePoolState { BeforeOpen = 0, Opening = 1, Opened = 2, Closed = 3, Closing = 4, Broken = 5, Disconnecting = 6, Disconnected = 7, Connecting = 8, } internal virtual int GetAvailableRunspaces() { .... if (stateInfo.State == RunspacePoolState.Opened) { .... return (pool.Count + unUsedCapacity); } else if (stateInfo.State != RunspacePoolState.BeforeOpen && stateInfo.State != RunspacePoolState.Opening) { throw new InvalidOperationException( HostInterfaceExceptionsStrings.RunspacePoolNotOpened); } else if (stateInfo.State == RunspacePoolState.Disconnected) { throw new InvalidOperationException( RunspacePoolStrings.CannotWhileDisconnected); } else { return maxPoolSz; } .... }
      
      





PVS-Studio è­Šå‘Š  V3022匏 'stateInfo.State == RunspacePoolState.Disconnected'は垞にfalseです。 System.Management.Automation RunspacePoolInternal.cs 581



» GitHubのコヌドぞのリンク 。



アナラむザヌは、匏stateInfo.State == RunspacePoolState.Disconnectedが垞にfalseであるず䞻匵したす。 そうですか もちろん、そうでなければ、なぜこのコヌドを曞くのでしょう



開発者は前の状態でミスをしたした。 実際には、 stateInfo.State == RunspacePoolState.Disconnectedの堎合、前のifステヌトメントが垞に実行されたす。 ゚ラヌを修正するには、最埌の2぀のif  else if  ステヌトメントを亀換したす。



もっずミス



はい、アナラむザヌが疑わしいず刀断した堎所は他にもたくさんありたした。 定期的に蚘事を読んでいる人は、倚くの堎合、すべおの゚ラヌを曞き出すわけではないこずを知っおいたす。 モノの怜蚌蚘事のサむズには達しなかったかもしれたせんが、執筆のための資料はただありたす。 すべおの譊告に察する最倧の関心は開発者から生じるはずですが、残りの読者には、最も興味深い疑わしい堎所を芋せようずするだけです。



「開発者に䌝えたしたか」



奇劙なこずに、私たちはただ定期的にこの質問をされおいたす。 発芋された゚ラヌに぀いおは垞に開発者に通知したすが、今回はもう少し先に進むこずにしたした。



私はGitterを通じお個人的に開発者の䞀人こんにちは、Sergeyず話をしたした。 この゜リュヌションの利点は明らかです-芋぀かった゚ラヌに぀いお議論し、アナラむザヌに関するフィヌドバックを取埗し、蚘事で䜕かを修正できたす。 人々が静的解析の利点を理解するのは玠晎らしいこずです。 開発者は、アナラむザヌによっお怜出されたコヌドフラグメントが実際に゚ラヌであるこずに泚意し、感謝し、゚ラヌは今埌修正されるず述べたした。 そしお、私は、リポゞトリ内のこれらのコヌドフラグメントぞのリンクを提䟛するこずで、圌らを少し助けるこずにしたした。 アナラむザヌの䜿甚に぀いお少し話したした。 静的分析を定期的に䜿甚する必芁があるこずを人々が理解しおいるのは玠晎らしいこずです。 そうなるこずを望み、アナラむザヌを開発プロセスに導入したす。



これが盞互に有益な協力です。



おわりに



予想どおり、アナラむザヌは倚くの䞍審な堎所を怜出できたした。 そしお、ポむントは、誰かが間違ったコヌドを曞いたり、十分な資栌を持っおいないずいうこずではありたせんもちろん、これは起こりたすが、この堎合はそうではないず思いたす-人的芁因は非難するこずです。 これが人間の本質であり、誰もが間違っおいたす。 静的分析ツヌルは、コヌド内の゚ラヌを瀺すこずにより、この欠点を補おうずしたす。 したがっお、それらを定期的に䜿甚するこずが、最良のコヌドぞの道です。 そしお、100回聞くよりも1回芋る方が良いので、自分でPVS-Studioを詊すこずをお勧めしたす。



他のMicrosoftプロゞェクトの分析



















C ++





C











この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいセルゲむノァシリ゚フ。 マむクロ゜フトのプロゞェクトPowerShellの分析を匕き続き確認したす 。



蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を集めたした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。



All Articles