
PVS-StudioããŒã«ã¯åžžã«æ¹åãããŠããŸãã åæã«ãCïŒã³ãŒãã¢ãã©ã€ã¶ãŒã¯æãåçã«éçºãããŠããŸãã2016幎ã«ã¯ã90åã®æ°ãã蚺æã«ãŒã«ã远å ãããŸããã ããŠãã¢ãã©ã€ã¶ãŒã®åè³ªã®æè¯ã®ææšã¯ãæ€åºãããšã©ãŒã§ãã å€§èŠæš¡ãªãªãŒãã³ãããžã§ã¯ããç¹°ãè¿ããã§ãã¯ããçµæãæ¯èŒããããšã¯ãåžžã«è峿·±ãããŸãéåžžã«äŸ¿å©ã§ãã 仿¥ã¯ãSharpDevelopãããžã§ã¯ãã®å確èªã«çŠç¹ãåœãŠãŸãã
ã¯ããã«
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)
äž¡æ¹ã®
ifãããã¯ã«åãæ¡ä»¶ãå«ãŸããŠããŸãã ãã®å Žåãããã°ã©ã ã®æ£ããããŒãžã§ã³ãã©ã®ããã«èŠãããã倿ããããšã¯å°é£ã§ãã äœæè
ãã³ãŒããã©ã°ã¡ã³ãã調ã¹ãå¿
èŠããããŸãã
ã¿ã€ã ãªãŒãªãã«çå€ãã§ãã¯PVS-Studioã¢ãã©ã€ã¶ãŒã®èŠå ïŒ
V3095 nullã«å¯ŸããŠæ€èšŒãããåã«ãäœçœ®ããªããžã§ã¯ãã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ204ã206ãTask.cs 204
public void JumpToPosition() { if (hasLocation && !position.IsDeleted)
倿°
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;
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è¡ã¯ããµãã¹ããªã³ã°ã/ 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ãã£ãŒã«ã
㯠ã
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ã®å確èªïŒæ°ãããã°ã¯ãããŸããïŒ