ãã€ã¯ããœããã«ãšã£ãŠããœãããŠã§ã¢è£œåã®ãœãŒã¹ã³ãŒããéãããšã¯æè¿ãè¯ãäŒçµ±ãã«ãªããŸããã ããã§ã¯ã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);
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ã®åæãåŒãç¶ã確èªããŸã ã