ã¯ããã«
SharpDevelopæ€èšŒã«é¢ãã以åã®èšäºã¯ã2015幎11æã«Andrey Karpovã«ãã£ãŠå ¬éãããŸããã åœæã¯ãæ°ããCïŒã¢ãã©ã€ã¶ãŒã®ã¿ããã¹ãããæåã®ãªãªãŒã¹ããªãªãŒã¹ããæºåãããŠããŸããã ããã§ããããã§ããããŒã¿çã䜿çšããŠãAndreiã¯SharpDevelopãããžã§ã¯ãã§ããã€ãã®èå³æ·±ããšã©ãŒãæ€åºããããšãã§ããŸããã ãã®åŸãSharpDevelopã¯ãæ£ã«çœ®ããããæ°ãã蚺æã«ãŒã«ãéçºããéã®å éšãã¹ãã«ã®ã¿ä»ã®ãããžã§ã¯ããšäžç·ã«äœ¿çšãããŸããã ãããŠæåŸã«ãSharpDevelopãããäžåºŠãã§ãã¯ããŸããã PVS-Studio 6.12ã¢ãã©ã€ã¶ãŒã®ãããçè質ããªããŒãžã§ã³ã䜿çšããŸãã
確èªã®ããã GitHubããŒã¿ã«ããSharpDevelopãœãŒã¹ã³ãŒãã®çŸåšã®ããŒãžã§ã³ãããŠã³ããŒãããŸããã ãããžã§ã¯ãã«ã¯ãçŽ100äžè¡ã®CïŒã³ãŒããå«ãŸããŠããŸãã åäœäžãåæè£ çœ®ã¯809åã®èŠåãçºè¡ããŸããã ãããã®ãã¡ãæåã®ã¬ãã«-74ã2çªç®-508ã3çªç®-227ïŒ
äœã¬ãã«ã§ã®èŠåã¯èæ ®ããŸãããçµ±èšçã«ã¯ãåœéœæ§ã®å²åã倧ããã§ãã Meduimããã³Highã¬ãã«ã®èŠåïŒ582èŠåïŒã®åæã«ããã誀ã£ããŸãã¯éåžžã«çãããæ§æèŠçŽ ã®çŽ40ïŒ ã®ååšãæããã«ãªããŸããã ããã¯233ã®èŠåã«çžåœããŸãã èšãæãããšãPVS-Studioã¢ãã©ã€ã¶ãŒã¯ãã³ãŒã1000è¡ãããå¹³å0.23ãšã©ãŒãæ€åºããŸããã ããã¯ãSharpDevelopãããžã§ã¯ãã³ãŒãã®é«å質ã瀺ããŠããŸãã ä»ã®å€ãã®ãããžã§ã¯ãã§ã¯ããã¹ãŠããã£ãšæ²ããèŠããŸãã
ç¹°ãè¿ã確èªããçµæãAndreiã®èšäºã§ä»¥åã«èª¬æããããšã©ãŒã®äžéšãçºèŠãããŸããã ããããèŠã€ãã£ããšã©ãŒã®ã»ãšãã©ã¯æ°ãããã®ã§ãã 次ã«ãæãèå³æ·±ããã®ãæããŸãã
æ€èšŒçµæ
åç §ã®ã³ããŒ/貌ãä»ããšã©ãŒ
ã éããšæªçœ®ã®éšå± ãã§ééããªããã®å°äœãå ããããšãã§ããééãã éçã³ãŒãåæã®äœ¿çšã®æçšæ§ãšã³ããŒããŒã¹ãã®å±éºæ§ã®é®®æãªå³è§£ã
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3102ã«ãŒãå ã®å®æ°ã€ã³ããã¯ã¹ã«ããã methodãSequencePoints ããªããžã§ã¯ãã®èŠçŽ ãžã®çãããã¢ã¯ã»ã¹ã CodeCoverageMethodTreeNode.cs 52
public override void ActivateItem() { if (method != null && method.SequencePoints.Count > 0) { CodeCoverageSequencePoint firstSequencePoint = method.SequencePoints[0]; .... for (int i = 1; i < method.SequencePoints.Count; ++i) { CodeCoverageSequencePoint sequencePoint = method.SequencePoints[0]; // <= .... } .... } .... }
forã«ãŒãã®åå埩ã§ãã³ã¬ã¯ã·ã§ã³ã®ãŒãèŠçŽ ãžã®ã¢ã¯ã»ã¹ã䜿çšãããŸãã ifæ¡ä»¶ã®çŽåŸã«è¿œå ã®ã³ãŒããæå³çã«åŒçšããŸããã ã«ãŒãå ã«é 眮ãããè¡ãã©ãããã³ããŒãããããç°¡åã«ç¢ºèªã§ããŸãã å€æ°åfirstSequencePointã¯sequencePointã«çœ®ãæããããŸããããã€ã³ããã¯ã¹ã«ãã£ãŠã¢ã¯ã»ã¹åŒãå€æŽããã®ãå¿ããŠããŸããã ãã®èšèšã®æ£ããããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
public override void ActivateItem() { if (method != null && method.SequencePoints.Count > 0) { CodeCoverageSequencePoint firstSequencePoint = method.SequencePoints[0]; .... for (int i = 1; i < method.SequencePoints.Count; ++i) { CodeCoverageSequencePoint sequencePoint = method.SequencePoints[i]; .... } .... } .... }
10ã®éããèŠã€ããããŸãã¯ããäžåºŠã³ããŒããŒã¹ã
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3021åäžã®æ¡ä»¶åŒãæã€2ã€ã®ãifãã¹ããŒãã¡ã³ãããããŸãã æåã®ãifãã¹ããŒãã¡ã³ãã«ã¯ã¡ãœããã®æ»ãå€ãå«ãŸããŸãã ããã¯ã2çªç®ã®ãifãã¹ããŒãã¡ã³ããç¡æå³ãªNamespaceTreeNode.csã§ããããšãæå³ããŸã87
public int Compare(SharpTreeNode x, SharpTreeNode y) { .... if (typeNameComparison == 0) { if (x.Text.ToString().Length < y.Text.ToString().Length) // <= return -1; if (x.Text.ToString().Length < y.Text.ToString().Length) // <= return 1; } .... }
äž¡æ¹ã®ifãããã¯ã«åãæ¡ä»¶ãå«ãŸããŠããŸãã ãã®å Žåãããã°ã©ã ã®æ£ããããŒãžã§ã³ãã©ã®ããã«èŠããããå€æããããšã¯å°é£ã§ãã äœæè ãã³ãŒããã©ã°ã¡ã³ãã調ã¹ãå¿ èŠããããŸãã
ã¿ã€ã ãªãŒãªãã«çå€ãã§ãã¯
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3095 nullã«å¯ŸããŠæ€èšŒãããåã«ãäœçœ®ããªããžã§ã¯ãã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ204ã206ãTask.cs 204
public void JumpToPosition() { if (hasLocation && !position.IsDeleted) // <= .... else if (position != null) .... }
å€æ°position㯠ãç䟡æ§nullããã§ãã¯ããã«äœ¿çšãããŸã ã æ€èšŒã¯å¥ã®æ¡ä»¶ã elseã³ãŒããããã¯ã§è¡ãããŸãã ã³ãŒãã®æ£ããããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
public void JumpToPosition() { if (hasLocation && position != null && !position.IsDeleted) .... else if (position != null) .... }
nullçå€ãã§ãã¯ããããŸãã
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3125 'mainAssemblyList'ãªããžã§ã¯ãã¯ãnullã«å¯ŸããŠæ€èšŒãããåŸã«äœ¿çšãããŸããã è¡ã確èªããŠãã ããïŒ304ã291ãClassBrowserPad.cs 304
void UpdateActiveWorkspace() { var mainAssemblyList = SD.ClassBrowser.MainAssemblyList; if ((mainAssemblyList != null) && (activeWorkspace != null)) { .... } .... mainAssemblyList.Assemblies.Clear(); // <= .... }
mainAssemblyListå€æ°ã¯ ãæåã«nullããã§ãã¯ããã«äœ¿çšãããŸã ã ãã ããå¥ã®ã³ãŒãã«ã¯ãã®ãããªãã§ãã¯ãå«ãŸããŠããŸãã ã³ãŒãã®æ£ããããŒãžã§ã³ïŒ
void UpdateActiveWorkspace() { var mainAssemblyList = SD.ClassBrowser.MainAssemblyList; if ((mainAssemblyList != null) && (activeWorkspace != null)) { .... } .... if (mainAssemblyList != null) { mainAssemblyList.Assemblies.Clear(); } .... }
äºæããªããœãŒãçµæ
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3078 ãOrderByãã¡ãœãããç¹°ãè¿ãåŒã³åºããšãå ã®ãœãŒãé ã倱ãããŸãã 'ThenBy'ã¡ãœããã䜿çšããŠãå ã®äžŠã¹æ¿ããä¿æããŸãã CodeCoverageMethodElement.cs 124
void Init() { .... this.SequencePoints.OrderBy(item => item.Line) .OrderBy(item => item.Column); // <= }
ãã®ã³ãŒããã©ã°ã¡ã³ãã®çµæã¯ã Columnãã£ãŒã«ãã®ã¿ã§SequencePointsã³ã¬ã¯ã·ã§ã³ããœãŒãããŸãã ã©ããããããã¯ã³ãŒãã®äœè ãæåŸ ãããã®ãšã¯ãŸã£ããç°ãªããŸãã åé¡ã¯ã OrderByã¡ãœãããå床åŒã³åºããšãåã®äžŠã¹æ¿ãã®çµæãèæ ®ããã«ã³ã¬ã¯ã·ã§ã³ã䞊ã¹æ¿ããããããšã§ãã ç¶æ³ãæ¹åããã«ã¯ã OrderByãå床åŒã³åºã代ããã«ThenByã䜿çšããå¿ èŠããããŸãã
void Init() { .... this.SequencePoints.OrderBy(item => item.Line) .ThenBy(item => item.Column); }
ãŒãã«ããæœåšçãªé€ç®
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3064æœåšçãªãŒãé€ç®ã åæ¯ãworkAmountãã®æ€æ»ãæ€èšããŠãã ããã XamlSymbolSearch.cs 60
public XamlSymbolSearch(IProject project, ISymbol entity) { .... interestingFileNames = new List<FileName>(); .... foreach (var item in ....) interestingFileNames.Add(item.FileName); .... workAmount = interestingFileNames.Count; workAmountInverse = 1.0 / workAmount; // <= }
interestFileNamesã³ã¬ã¯ã·ã§ã³ã空ã®å ŽåããŒãã«ããé€ç®ãçºçããŸãã é©åãªãšã©ãŒä¿®æ£ãªãã·ã§ã³ãææ¡ããã®ã¯ååå°é£ã§ãã ãã ãããããã«ããŠããå€æ°workAmountããŒãã«çããç¶æ³ã§ã¯ ãå€æ°workAmountInverseã®å€ãèšç®ããã¢ã«ãŽãªãºã ã®æ¹è¯ãå¿ èŠã§ã ã
åå²ãåœãŠ
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒV3008 'ignoreDialogIdSelectedInTextEditor'å€æ°ã«ã¯å€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªïŒ204ã201ãWixDialogDesigner.cs 204
void OpenDesigner() { try { ignoreDialogIdSelectedInTextEditor = true; // <= WorkbenchWindow.ActiveViewContent = this; } finally { ignoreDialogIdSelectedInTextEditor = false; // <= } }
tryãããã¯ã®çµæã«é¢ä¿ãªããå€æ°ignoreDialogIdSelectedInTextEditorã¯falseã«ãªããŸã ã ãèœãšãç©Žããååšããå¯èœæ§ãæé€ããããã«ã䜿çšãããå€æ°ã®å®£èšã確èªããŸãã ignoreDialogIdSelectedInTextEditor宣èšã¯æ¬¡ã®ãšããã§ãã
bool ignoreDialogIdSelectedInTextEditor;
IWorkbenchWindowããã³ActiveViewContentã®å®£èšïŒ
public IWorkbenchWindow WorkbenchWindow { get { return workbenchWindow; } } IViewContent ActiveViewContent { get; set; }
ã芧ã®ãšããã ignoreDialogIdSelectedInTextEditorå€æ°ãå€ã«åå²ãåœãŠããæ確ãªçç±ã¯ãããŸããã äžèšã®æ§æã®æ£ããããŒãžã§ã³ãã æçµçã«ã§ã¯ãªãcatchããŒã¯ãŒãã䜿çšããŠå ã®ãã®ãšç°ãªãå¯èœæ§ãããããšãææ¡ããããšæããŸãã
void OpenDesigner() { try { ignoreDialogIdSelectedInTextEditor = true; WorkbenchWindow.ActiveViewContent = this; } catch { ignoreDialogIdSelectedInTextEditor = false; } }
誀ã£ãéšåæååæ€çŽ¢
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3053éå°ãªè¡šçŸã ãµãã¹ããªã³ã°ã/ debugãããã³ã/ debugportãã調ã¹ãŸãã NDebugger.cs 287
public bool IsKernelDebuggerEnabled { get { .... if (systemStartOptions.Contains("/debug") || systemStartOptions.Contains("/crashdebug") || systemStartOptions.Contains("/debugport") || // <= systemStartOptions.Contains("/baudrate")) { return true; } .... } }
systemStartOptionsè¡ã¯ããµãã¹ããªã³ã°ã/ debugããŸãã¯ã/ debugportãã®ãããããé 次æ€çŽ¢ããŸãã åé¡ã¯ãæååã/ debugãèªäœãã/ debugportãã®éšåæååã§ããããšã§ãã ãããã£ãŠããµãã¹ããªã³ã°ã/ debugããèŠã€ãããšããµãã¹ããªã³ã°ã/ debugportããããã«æ€çŽ¢ããŠãæå³ããããŸããã ããããããã¯ãšã©ãŒã§ã¯ãããŸããããã³ãŒãã¯åçŽåã§ããŸãã
public bool IsKernelDebuggerEnabled { get { .... if (systemStartOptions.Contains("/debug") || systemStartOptions.Contains("/crashdebug") || systemStartOptions.Contains("/baudrate")) { return true; } .... } }
ãšã©ãŒåŠçäŸå€
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3052å ã®äŸå€ãªããžã§ã¯ããexãã飲ã¿èŸŒãŸããŸããã å ã®äŸå€ã®ã¹ã¿ãã¯ã倱ãããå¯èœæ§ããããŸãã ReferenceFolderNodeCommands.cs 130
DiscoveryClientProtocol DiscoverWebServices(....) { try { .... } catch (WebException ex) { if (....) { .... } else { throw ex; // <= } } .... }
ãã®å Žåããã£ãããããäŸå€ãåã³ã¹ããŒãããããã throw exãåŒã³åºããšãå ã®äŸå€ã®ã¹ã¿ãã¯ãäžæžããããŸãã ä¿®æ£ããããªãã·ã§ã³ïŒ
DiscoveryClientProtocol DiscoverWebServices(....) { try { .... } catch (WebException ex) { if (....) { .... } else { throw; } } .... }
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããŠããªããã£ãŒã«ãã䜿çšãã
PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ V3128 'contentPanel'ãã£ãŒã«ãã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããåã«äœ¿çšãããŸãã SearchResultsPad.cs 66
Grid contentPanel; public SearchResultsPad() { .... defaultToolbarItems = ToolBarService .CreateToolBarItems(contentPanel, ....); // <= .... contentPanel = new Grid {....}; .... }
contentPanelãã£ãŒã«ã㯠ã SearchResultsPadã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®CreateToolBarItemsã¡ãœããã«ãã©ã¡ãŒã¿ãŒã®1ã€ãšããŠæž¡ãããŸã ã åæã«ããã®ãã£ãŒã«ãã¯äœ¿çšåŸã«åæåãããŸãã ãããããã®å Žåãå€æ°contentPanelãšnullãçããå¯èœæ§ãCreateToolBarItemsã¡ãœããã®æ¬äœããã³ã¹ã¿ãã¯ã«æ²¿ã£ãŠèæ ®ããããšãã§ããããããšã©ãŒã¯ãããŸããã ããããã³ãŒãã¯çãããèŠããäœæè ã«ããæ€èšŒãå¿ èŠã§ãã
ãã®èšäºã§ã¯ãPVS-Studioã¢ãã©ã€ã¶ãŒãæ€åºãããã¹ãŠã®ãšã©ãŒããã¯çšé ããã®ã®ãç§ã«ãšã£ãŠèå³æ·±ããšæããããšã©ãŒã®ã¿ã説æããããšã匷調ããŸãã ãããžã§ã¯ãã®äœæè ã¯ç§ãã¡ã«é£çµ¡ããäžæçãªã©ã€ã»ã³ã¹ããŒãååŸããŠããããžã§ã¯ãã®ãã培åºçãªæ€èšŒãå®è¡ã§ããŸãã
ãããã«
ãããŠåã³PVS-Studioã¯å€±æããŸããã§ãããSharpDevelopãããžã§ã¯ãã®åæ€èšäžã«ãæ°ããèå³æ·±ããšã©ãŒãèŠã€ãããŸããã ãããŠãããã¯ã¢ãã©ã€ã¶ãŒããã®ä»äºãããŸãè¡ããç§ãã¡ã®åšãã®äžçãããå°ãå®ç§ã«ããããšãã§ããããšãæå³ããŸãã
PVS-Studioéçã¢ãã©ã€ã¶ãŒãç¡æã§äœ¿çšããŠèªåã®ãããžã§ã¯ãããã§ãã¯ããæ©äŒãå©çšããŠããã€ã§ããã®ããã»ã¹ã«åå ã§ããŸãã
PVS-StudioãããŠã³ããŒãããŠè©ŠããŠãã ããïŒ http : //www.viva64.com/en/pvs-studio/
åçšã©ã€ã»ã³ã¹ã®ååŸã«é¢ãã質åã«ã€ããŠã¯ãã¡ãŒã«ã§ãåãåãããã ããã ãã¢ããŒãžã§ã³ã®å¶éãåé€ããå Žåã¯ãPVS-Studioã®å æ¬çãªç 究ã®äžæçãªã©ã€ã»ã³ã¹ãååŸããããã«ç§ãã¡ã«æžã蟌ãããšãã§ããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSergey Khrenovã SharpDevelopã®å確èªïŒæ°ãããã°ã¯ãããŸããïŒ
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãåéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã