ãã€ã¯ããœããã«ãšã£ãŠããœãããŠã§ã¢è£œåã®ãœãŒã¹ã³ãŒããéãããšã¯æè¿ãè¯ãäŒçµ±ãã«ãªããŸããã ããã§ã¯ã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èŠçŽ ãå«ãïŒã¯ç¡èŠãããŸãã
ãã®åé¡ã¯ããã€ãã®æ¹æ³ã§è§£æ±ºã§ããŸãã
- Listã¯ã©ã¹ã®AddRangeã¡ãœããã䜿çšãããšãçŸåšã®ãªã¹ãã«æ°ããèŠçŽ ãè¿œå ãããŸãã
- ToListã¡ãœããã®åŒã³åºããå¿ããã«ã Concatã¡ãœããã®çµæã䜿çšããŠãç®çã®åã«ãã£ã¹ãããŸãã
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ã€èŠã€ããŸããã
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ° 'j'ã 'child'ã確èªããŠãã ããã System.Management.Automation Job.cs 1900
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ° 'j'ã 'child'ã確èªããŠãã ããã System.Management.Automation Job.cs 1923
æäœã®é åºãæ£ãããããŸãã
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 ++
- CNTKæ€èšŒ ;
- ChakraCoreã確èªããŠãã ãã ã
- CoreCLRã確èªããŠãã ãã ã
- Windows 8ãã©ã€ããŒãµã³ãã«ã確èªããŠãã ãã ã
- Microsoft Word 1.1aã®æ€èšŒ ã
- Visual C ++ã©ã€ãã©ãªã®ç¢ºèªïŒ 1ã2 ;
- ã«ãµãã©ã³ã«ã確èªããŠãã ãã ã
CïŒ
- CoreFXã確èªããŠãã ãã ã
- .Net Compiler PlatformïŒRoslynïŒã®ç¢ºèª ;
- ã³ãŒãå¥çŽã®æ€èšŒ ;
- MSBuildã確èªããŠãã ãã ã
- WPFãµã³ãã«ã確èªããŸã ã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã ãã€ã¯ããœããã®ãããžã§ã¯ãïŒPowerShellã®åæãåŒãç¶ã確èªããŸã ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã