
çŸåšãPVS-StudioããŒã ã¯CïŒã³ãŒãã®éçã¢ãã©ã€ã¶ãŒãç©æ¥µçã«éçºããŠããŸãã 2015幎æ«ãŸã§ã«ã¢ãã©ã€ã¶ãŒã®æåã®ããŒãžã§ã³ããªãªãŒã¹ããäºå®ã§ãã ãããŸã§ã®éãç§ã®ä»äºã¯ãPVS-StudioããŒã«ã§CïŒããã°ã©ããŒã«äºåã«èå³ãæã£ãŠãããããã«ãããã€ãã®èšäºãæžãããšã§ãã ä»æ¥ãæŽæ°ãããã€ã³ã¹ããŒã©ãŒãæäŸãããŸããã ããã§ãCïŒãµããŒãä»ãã®PVS-Studioãã€ã³ã¹ããŒã«ããäœãããã§ãã¯ããããšããå¯èœã«ãªããŸããã ç§ã¯ãããå©çšããã®ãé ããªãã£ãã®ã§ãè ã§æåã«çŸãããã®ããã§ãã¯ããããšã«ããŸããã Umbracoãããžã§ã¯ããæåã«çŸããŸããã ãã¡ãããçŸåšã®ããŒãžã§ã³ã®ã¢ãã©ã€ã¶ãŒã§ã¯ã»ãšãã©äœãã§ããŸããããããã§ãã§ã«å°ããªèšäºãæžãã®ã«ååã§ãã
ãŠã³ãã©ã³
Umbracoã¯ãã³ã³ãã³ããäžçäžã«å ¬éããããã«äœ¿çšããããªãŒãã³ãœãŒã¹ã®ã³ã³ãã³ã管çã·ã¹ãã ãã©ãããã©ãŒã ã§ãã CïŒã§æžãããŠããŸãã 4.5ã®ãªãªãŒã¹ä»¥æ¥ãã·ã¹ãã å šäœãMITã©ã€ã»ã³ã¹ã®äžã§å©çšå¯èœã«ãªããŸããã
ãããžã§ã¯ãã¯äžèŠæš¡ã§ãã ãã ããCïŒã§èšè¿°ãããéšåã¯ããã»ã©å€§ãããããŸããã ãããžã§ã¯ãã®ã»ãšãã©ã¯JavaScriptã§èšè¿°ãããŠããŸãã åèšã§ããããžã§ã¯ãã«ã¯çŽ3200åã®ãã¡ã€ã«ããããæ¡åŒµåã¯ã.csããåèšãµã€ãºã¯15ã¡ã¬ãã€ãã§ãã CïŒã³ãŒãã®è¡æ°ïŒ400 KLOCã
PVS-Studio 6.00ã«ã€ããŠ
æ€èšŒã¯ãPVS-Studio 6.00ã¢ãã©ã€ã¶ãŒã®ã¢ã«ãã¡ããŒãžã§ã³ã䜿çšããŠå®è¡ãããŸãã ãã®ããŒãžã§ã³ã«ã¯2ã€ã®å€§ããªå€æŽããããŸãã
- CïŒãããžã§ã¯ãã®åæããµããŒããããŸãã
- ã¢ãã©ã€ã¶ã¯VS2005ãVS2008ããµããŒãããªããªããŸãã ãšã©ãŒãä¿®æ£ãããå ŽåãVS2005 / 2008ã§äœæ¥ããŠããå°æ°ã®ãŠãŒã¶ãŒã«ãããŒãžã§ã³5.31以éã®ããŒãžã§ã³5.xxãåŒãç¶ã䜿çšããããšããå§ãããŸãã
äŸ¡æ Œèšå®ããªã·ãŒã¯å€ãããŸããã æ°ãã補åãäœæããã®ã§ã¯ãªããæ¢åã®è£œåã®æ©èœãæ¡åŒµããŸãã ãã1ã€ã®ããã°ã©ãã³ã°èšèªããµããŒãããã ãã§ãã 以åã¯ãPVS-Studioãè³Œå ¥ããŠãCãC ++ã C ++ / CLI ã C ++ / CXã®èšèªã§æžããããããžã§ã¯ãããã¹ãããããã«äœ¿çšã§ããŸããã CïŒãããžã§ã¯ãããã§ãã¯ããè¿œå ã®æ©äŒããããŸãã ããã¯äŸ¡æ Œã«ã¯äžå圱é¿ããŸããã ãã§ã«C ++ã®ã¢ãã©ã€ã¶ãŒãè³Œå ¥ããŠãã人ã¯ãCïŒã³ãŒããåæã«ãã§ãã¯ã§ããŸãã
ãªãCïŒãªã®ã§ããïŒ
äŒè°ã§ãCïŒã¢ãã©ã€ã¶ãŒã®äœæã¯ããŸãããããããªããšããèšããŸããã C ++ã®C ++ã«ååšããå€ãã®ãšã©ãŒã¯ãåã«äžå¯èœã§ãã æ¬åœã«ããã§ãã ããšãã°ãCïŒã«ã¯ãããããmemsetïŒïŒãªã©ã®é¢æ°ã¯ãªãã質éã®åé¡ããããŸããïŒmemsetïŒïŒã«é¢é£ããäŸãåç §ããŠãã ããïŒ V511 ã V512 ã V575 ã V579 ã V597 ã V598 ïŒã
ããããç§ã¯åŸã ã«èããå€ããŸããã PVS-Studioã«ãã£ãŠæ€åºãããå€æ°ã®ãšã©ãŒã¯ãããã°ã©ãã³ã°èšèªã®äžéšã®æ©èœã§ã¯ãªããããã°ã©ããŒã®äžæ³šæã«é¢é£ããŠããŸãã ç§ã¯ã¿ã€ããã¹ãšã³ããŒïŒããŒã¹ãåŸã«å€±æããã³ãŒãå€æŽãæå³ããŸãã ããã¯ãC ++åãPVS-Studioã¢ãã©ã€ã¶ãŒã匷åãªå Žæã§ããããããã®éçºã¯CïŒã«ãé©çšã§ãããšå€æããŸããã
CïŒèšèªã¯ãå€æ°åã®æ··ä¹±ãã泚æã®åªå€±ã«é¢é£ããã æçµè¡ã®åœ±é¿ ãããä¿è·ããŸããã
CïŒã¢ãã©ã€ã¶ãŒã®äœæã決å®ãããã1ã€ã®éèŠãªèŠçŽ ã¯ãRoslynã®ç»å Žã§ãã ããããªããã°ãã¢ãã©ã€ã¶ãŒãäœæããäœæ¥ã¯ç§ãã¡ã«ãšã£ãŠããŸãã«ãé«äŸ¡ã«ãªããŸãã
Roslynã¯ãCïŒããã³Visual Basicåãã®ãªãŒãã³ãœãŒã¹ã®ã³ã³ãã€ã«ãã©ãããã©ãŒã ã§ãã Roslynã¯2ã€ã®äž»ãªã¢ã¯ã·ã§ã³ãå®è¡ããŸããæ§æããªãŒãæ§ç¯ïŒè§£æïŒããã³ã³ãã€ã«ããŸãã ããã«ããœãŒã¹ã³ãŒããåæããååž°çã«ãã€ãã¹ããVisual Studioãããžã§ã¯ãã§äœæ¥ãããã®å Žã§ã³ãŒããå®è¡ã§ããŸãã
äœãé¢çœãã£ãïŒ
C ++ã«ã¯ããæ°ã«å ¥ãã®V501蚺æããã°ã©ã ããããŸãã CïŒïŒV3001ã«å¯Ÿå¿ãããã®ããããŸãã ãã®èšºæããå§ããŸãããã
ã³ãŒãã¹ããããN1
ã³ãŒãã«ã¯ãã©ãŒã«ã«ãã€ã³ãããããã£ããããŸãã
[DataMember(Name = "focalPoint")] public ImageCropFocalPoint FocalPoint { get; set; }
ãã®ããããã£ã®ã¿ã€ãã¯ãImageCropFocalPointãã§ããã®å®çŸ©ã以äžã«ç€ºããŸãã
public class ImageCropFocalPoint { [DataMember(Name = "left")] public decimal Left { get; set; } [DataMember(Name = "top")] public decimal Top { get; set; } }
ãã®ãããªããããã£ãæäœãããšãã«ãã¹ãç¯ãããšã¯äžå¯èœã«æããŸãã ããããéããŸãã HasFocalPointïŒïŒã¡ãœããã«è¿·æãªã¿ã€ããã¹ããããŸãïŒ
public bool HasFocalPoint() { return FocalPoint != null && FocalPoint.Top != 0.5m && FocalPoint.Top != 0.5m; }
ãããããã¯2åãã§ãã¯ãããŸããããå·Šãã¯å¿ããŠããŸããã
PVS-Studioã®å¯Ÿå¿ããèŠåïŒV3001ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åäžã®å¯æ¬¡åŒãFocalPoint.TopïŒ= 0.5mãããããŸãã ImageCropDataSet.cs 58
ã³ãŒãã¹ããããN2
protected virtual void OnBeforeNodeRender(ref XmlTree sender, ref XmlTreeNode node, EventArgs e) { if (node != null && node != null) { if (BeforeNodeRender != null) BeforeNodeRender(ref sender, ref node, e); } }
PVS-StudioèŠåïŒV3001ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åäžã®å¯æ¬¡åŒãnodeïŒ= NullãããããŸãã BaseTree.cs 503
ãããŒãããªã³ã¯ãäºéãã§ãã¯ãããŸãã æãå¯èœæ§ãé«ãã®ã¯ããéä¿¡è ããªã³ã¯ã確èªããããšã§ããã
ã³ãŒãã¹ããããN3
public void Set (ExifTag key, string value) { if (items.ContainsKey (key)) items.Remove (key); if (key == ExifTag.WindowsTitle || <<<<---- key == ExifTag.WindowsTitle || <<<<---- key == ExifTag.WindowsComment || key == ExifTag.WindowsAuthor || key == ExifTag.WindowsKeywords || key == ExifTag.WindowsSubject) { items.Add (key, new WindowsByteString (key, value)); .... }
PVS-StudioèŠåïŒV3001ã||ãã®å·Šãšå³ã«åäžã®ãµãåŒãkey == ExifTag.WindowsTitleãããããŸã æŒç®åã ExifPropertyCollection.cs 78
ããŒã¯ãå®æ°ãExifTag.WindowsTitleããš2åæ¯èŒãããŸãã ãã®ééããã©ãã»ã©æ·±å»ããå€æããã®ã¯é£ããã§ãã ããããããã§ãã¯ã®1ã€ã¯äžèŠã§ãããåé€ã§ããŸãã ããããããããä»ã®å®æ°ãšæ¯èŒããå¿ èŠããããŸãã
ã³ãŒãã¹ããããN4
ãšã©ãŒã®ååšããŸã£ããããããªãå¥ã®ã±ãŒã¹ãèããŠã¿ãŸãããã ãã ãããã®ã³ãŒãã¯ããäžåºŠç¢ºèªãã䟡å€ããããŸãã
4ã€ã®ååä»ãå®æ°ãæã€åæããããŸãã
public enum DBTypes { Integer, Date, Nvarchar, Ntext }
ãã ããäœããã®çç±ã§SetPropertyïŒïŒã¡ãœãããèæ ®ãããªãã·ã§ã³ã¯3ã€ã ãã§ãã ç¹°ãè¿ããŸãããããã¯ééãã ãšèšã£ãŠããã®ã§ã¯ãããŸããã ãã ããã¢ãã©ã€ã¶ãŒã¯ãã®ã³ãŒãã«æ³šæãæãããšãææ¡ããŠãããå®å šã«åæããŸãã
public static Content SetProperty(....) { .... switch (((DefaultData)property.PropertyType. DataTypeDefinition.DataType.Data).DatabaseType) { case DBTypes.Ntext: case DBTypes.Nvarchar: property.Value = preValue.Id.ToString(); break; case DBTypes.Integer: property.Value = preValue.Id; break; } .... }
èŠåPVS-StudioïŒV3002 switchã¹ããŒãã¡ã³ãã¯ã 'DBTypes'åæåã®ãã¹ãŠã®å€ãã«ããŒããŠããŸããïŒæ¥ä»ã ContentExtensions.cs 286
ã³ãŒãã¹ããããN5
public TinyMCE(IData Data, string Configuration) { .... if (p.Alias.StartsWith(".")) styles += p.Text + "=" + p.Alias; else styles += p.Text + "=" + p.Alias; .... }
PVS-StudioèŠåïŒV3004ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã TinyMCE.cs 170
ã³ãŒãã¹ããããN6ãN7
èšäºã®åé ã§ãCïŒã¯ã æåŸã®è¡å¹æ ãããä¿è·ããªããšè¿°ã¹ãŸããã ãããŠã察å¿ããäŸã«è¡ããŸããã
public void SavePassword(IMember member, string password) { .... member.RawPasswordValue = result.RawPasswordValue; member.LastPasswordChangeDate = result.LastPasswordChangeDate; member.UpdateDate = member.UpdateDate; }
PVS-StudioèŠåïŒV3005ãmember.UpdateDateãå€æ°ã¯ããèªäœã«å²ãåœãŠãããŸãã MemberService.cs 114
ããã°ã©ããŒã¯ãã¯ã©ã¹ã¡ã³ããŒããçµæããªããžã§ã¯ããããã¡ã³ããŒããªããžã§ã¯ãã«ã³ããŒããŸããã ããããæåŸã®ç¬éã«ããã®äººã¯ãªã©ãã¯ã¹ããŠã¡ã³ããŒãmember.UpdateDateããèªåã«ã³ããŒããŸããã
ãŸããSavePasswordïŒïŒã¡ãœããããã¹ã¯ãŒãã§æ©èœããããšãèŠåããŠããŸããã€ãŸããããèªäœã«æ³šæãæãå¿ èŠããããŸãã
UserService.csãã¡ã€ã«ã§ãŸã£ããåãã³ãŒããã©ã°ã¡ã³ãã確èªã§ããŸãïŒ269è¡ç®ãåç §ïŒã ã»ãšãã©ã®å Žåã圌ã¯ãã§ãã¯ããã«åçŽã«ã³ããŒãããŸããã
ã³ãŒãã¹ããããN8
private bool ConvertPropertyValueByDataType(....) { if (string.IsNullOrEmpty(string.Format("{0}", result))) { result = false; return true; } .... return true; .... return true; .... return true; .... return true; .... .... return true; }
PVS-StudioèŠåïŒV3009ãã®ã¡ãœãããåžžã«åãå€ã®ãtrueããè¿ãã®ã¯å¥åŠã§ãã DynamicNode.cs 695
ãã®ã¡ãœããã¯ãå€æ°ã®ãifãã¹ããŒãã¡ã³ããšå€æ°ã®ãreturnãã¹ããŒãã¡ã³ãã䜿çšããŸãã ãã¹ãŠã®ãreturnãã¹ããŒãã¡ã³ããå€ãtrueããè¿ãããšã¯é©ãã¹ãããšã§ãã ããã«ééãã¯ãããŸããïŒ ããããã©ããã§ãfalseããè¿ãå¿ èŠããã£ãã®ã§ããããïŒ
ã³ãŒãã¹ããããN9
èªè ã«æ³šæã確èªãã次ã®ã³ãŒããã©ã°ã¡ã³ãã§ãšã©ãŒãèŠã€ããããšããå§ãããŸãã ãã®æ¹æ³ãåŠç¿ããŸããã以äžã®ããã¹ããèªãã§ã¯ãããŸããã 誀ã£ãŠãããè¡ããªãããã«ãã»ãã¬ãŒã¿ãŒïŒãŠãã³ãŒã³:)ãæ¿å ¥ããŸããã
public static string GetTreePathFromFilePath(string filePath) { List<string> treePath = new List<string>(); treePath.Add("-1"); treePath.Add("init"); string[] pathPaths = filePath.Split('/'); pathPaths.Reverse(); for (int p = 0; p < pathPaths.Length; p++) { treePath.Add( string.Join("/", pathPaths.Take(p + 1).ToArray())); } string sPath = string.Join(",", treePath.ToArray()); return sPath; }

å³1.ãšã©ãŒãšã¯äœãã®èª¬æããã³ãŒããåé¢ããŸãã
PVS-StudioèŠåïŒV3010é¢æ°ãReverseãã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã DeepLink.cs 19
ReverseïŒïŒã¡ãœãããåŒã³åºãããšã«ãããããã°ã©ããŒã¯é åãpathPathsããå€æŽããããšãèšç»ããŸããã ããããããªã¹ãïŒ List <T> .Reverse ïŒ ã«é¢ããŠã¯ããã®ãããªæäœã¯å®å šã«æ£ãããšããäºå®ã«æ··ä¹±ããŠããã®ã§ãããã ãã ããé åã«é¢ããŠã¯ãReverseïŒïŒã¡ãœããã¯å ã®é åãå€æŽããŸããã é åã®å Žåããã®ã¡ãœãã㯠'Enumerable'ã¯ã©ã¹ã®ReverseïŒïŒæ¡åŒµã¡ãœãããéããŠå®è£ ãããŸãã ãã®ã¡ãœããã¯ãé©åãªçœ®æãå®è¡ããŸããããå€æŽãããã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
æžãã®ã¯æ£ããã§ãããïŒ
string[] pathPaths = filePath.Split('/'); pathPaths = pathPaths.Reverse().ToArray();
ãŸãã¯ãã®ããã«ïŒ
string[] pathPaths = filePath.Split('/').Reverse().ToArray();
ã³ãŒãã¹ããããN10
PVS-Studioã¢ãã©ã€ã¶ãŒã¯ãäžéšã®ã¡ãœããã®ããã£ã®äžå¯©ãªäžèŽã«ã€ããŠãV3013ã«ããã€ãã®èŠåãçºè¡ããŸããã ç§ã®æèŠã§ã¯ããããã®èŠåã¯ãã¹ãŠééã£ãŠããŸãã ãããã®èŠåã®1ã€ã ãã泚æã«å€ããããã«æããŸãã
public void GetAbsolutePathDecoded(string input, string expected) { var source = new Uri(input, UriKind.RelativeOrAbsolute); var output = source.GetSafeAbsolutePathDecoded(); Assert.AreEqual(expected, output); } public void GetSafeAbsolutePathDecoded(string input, string expected) { var source = new Uri(input, UriKind.RelativeOrAbsolute); var output = source.GetSafeAbsolutePathDecoded(); Assert.AreEqual(expected, output); }
PVS-StudioèŠåïŒV3013ãGetAbsolutePathDecodedãé¢æ°ã®æ¬äœããGetSafeAbsolutePathDecodedãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãã UriExtensionsTests.cs 141
ããããGetAbsolutePathDecodedïŒïŒã¡ãœããå ã§ã¯ã䜿çšããªãã§ãã ãã
source.GetSafeAbsolutePathDecoded()
ã§ã
source. GetAbsolutePathDecoded()
èªåãæ£ãããã©ããã¯ããããŸãããããã®å Žæã¯ãã§ãã¯ãã䟡å€ããããŸãã
質åãžã®åç
ãã®èšäºã¯ãæ°ããèªè ã察象ãšããŠããŸãã ãããã£ãŠãçºçããå¯èœæ§ã®ããå€ãã®åé¡ãäºèŠããŠããŸãã ãããã®ããã€ãã«åãã£ãŠçããããšããŸãã
çºèŠãããæ¬ é¥ããããžã§ã¯ãéçºè ã«éç¥ããŸãããïŒ
ã¯ããç§ãã¡ã¯åžžã«ãããè©Šã¿ãŸãã
PVS-Studioã䜿çšããŠPVS-Studioèªäœã®ã³ãŒããæ€èšŒããŸããïŒ
ã¯ã
PVS-Studioã¯MonoããµããŒãããŠããŸããïŒ
ãã
ãããã®è³ªåããã®ä»ã®è³ªåã«å¯Ÿãããã詳现ãªåçã¯ãã PVS-Studioã«é¢ããèšäºã®èªè ããã®è³ªåãžã®åç ãã®æ³šã«èšèŒãããŠããŸãã
ãããã«
ãããžã§ã¯ãã«å€ãã®ãšã©ãŒã¯ãããŸããã§ããã C ++ã®èªè ããã®èªè ã¯ãããããªãèµ·ãã£ãŠããã®ãããã§ã«ç¥ã£ãŠããŸãã ããããç§ãã¡ã¯ãŸã CïŒããã°ã©ããŒãåŸæãèªæããŠããªãã®ã§ãããã€ãã®éèŠãªãã€ã³ãããªã¹ãããŸãã
- éçã¢ãã©ã€ã¶ãŒã¯éåžžã®äœ¿çšããŒã«ã§ãã ãã®æå³ã¯ãæ©ã段éã§ãšã©ãŒãèŠã€ããããšã§ãã ãããžã§ã¯ãã®1åéãã®ãã§ãã¯ã«ã¯æå³ããããŸããã ååãšããŠãããã°ã©ã ã®åäœã«é倧ãªåœ±é¿ãäžããªããšã©ãŒããŸãã¯ã³ãŒãã®ãã£ãã«äœ¿çšãããªãã»ã¯ã·ã§ã³ã«ãããšã©ãŒã¯ããã®æ¹æ³ã§æ€åºãããŸãã ãã®çç±ã¯ããã®éãã£ãšæ¬åœã®ééããæ±ãšè¡ã§ä¿®æ£ãããããã§ãã ãããã¯ããã°ã©ããŒã«ãã£ãŠçºèŠãããäœæéãã³ãŒãããããã°ã ããã¹ã¿ãŒã¯ãããããããŠããã«æªãããšã«ãŠãŒã¶ãŒãçºèŠããŸããã ãããã®ãšã©ãŒã®å€ãã¯ãéçã³ãŒãã¢ãã©ã€ã¶ãŒãå®æçã«äœ¿çšããã°ããã«ä¿®æ£ã§ããŸãã CïŒã³ã³ãã€ã©ã®èŠåã®æ¡åŒµãšããŠPVS-Studioãæ€èšããŠãã ããã çµå±ã®ãšãããã³ã³ãã€ã©ãŒã«ãã£ãŠçºè¡ãããèŠåã®ãªã¹ãã幎ã«1å以äžè¡šç€ºãããããšãé¡ã£ãŠããŸããïŒ ããã«ã€ããŠã¯ãèšäºã Leo Tolstoy and Static Code Analysis ãã§è©³ãã説æããŠããŸãã
- èšäºã§ã¯ãèå³æ·±ããšæãããã³ãŒããã©ã°ã¡ã³ãã®ã¿ãåãäžããŠããŸãã ååãšããŠãã¢ãã©ã€ã¶ãŒãéåžžã«æ£çŽã«çããããšå€æããã³ãŒãã«ã€ããŠã¯èšè¿°ããŸããããå®éã®ãšã©ãŒããªãããšã¯æããã§ãã ããããåãã³ãŒãããšåŒã³ãŸãã PVS-Studioã䜿çšããå Žåããã®ã³ãŒãã¯ç¢ºèªãã䟡å€ããããŸãã ããããèšäºã§ãã®ãããªå Žæã«ã€ããŠè©±ãããšã¯äžé©åã§ãã
- ãã®é ç®ã¯C ++çšã§ã¯ãããŸãããããããŸã§ã®ãšããCïŒçšã«ååšããŸãã ãŸã å€ãã®èšºæãå®è£ ããŠããŸããããæ¥éã«åããŠããŸãã CïŒãŠãã³ãŒã³ãå°ãæé·ãããŸãã ãããã圌ã¯ããªããèŠããŸãïŒ
ãæž èŽããããšãããããŸããããã¹ãŠã®çµ¶æçãªããã°ã©ã ããç¥ãããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã æåã®CïŒãããžã§ã¯ãåæ ã