
PVS-Studioéçã¢ãã©ã€ã¶ãŒã®éçºè ã§ããç§ãã¡ã«ãšã£ãŠãããã¯èå³æ·±ããããžã§ã¯ãããã¹ãããçºèŠããããšã©ãŒã«ã€ããŠäººã ïŒéçºè ãå«ãïŒã«äŒãã次ã«ãã¢ãã©ã€ã¶ãŒãå床ãã¹ããããã1ã€ã®æ©äŒã§ãã ä»æ¥ã¯ãOrchard CMSãããžã§ã¯ãã§èŠã€ãã£ããšã©ãŒã«ã€ããŠèª¬æããŸãã
ãªãŒãã£ãŒãCMSã«ã€ããŠ
ãããžã§ã¯ãã®èª¬æã¯ãµã€ãããåãããŸã ã
Orchard CMSãããžã§ã¯ãã¯ããããžã§ã¯ãã®æåã®ããŒã¿ããŒãžã§ã³ã®ãªãªãŒã¹ã§2010幎3æã«çºè¡šãããŸããã Orchard CMSã®äœæè ã¯ã次ã®èŠä»¶ãæºããæ°ããASP.NET MVCãã¬ãŒã ã¯ãŒã¯äžã«ã³ã³ãã³ã管çã·ã¹ãã ãæ§ç¯ãããšããç®æšãèšå®ããŸããã
- ã³ãã¥ããã£ã®ããŒãºã«å¿ããŠãç¡æã§ç¡æã®ãããžã§ã¯ããéããŸãã
- ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ãšå¿ èŠãªãã¹ãŠã®CMSããŒã«ãåããé«éãšã³ãžã³ã
- ã³ãã¥ããã£ã®ã¢ãžã¥ãŒã«ãããŒããããã³ãã®ä»ã®æ¡åŒµã³ã³ããŒãã³ãã®å ¬éã¢ã¯ã»ã¹å¯èœãªãªã³ã©ã€ã³ã®ã£ã©ãªãŒã
- é«å質ã®ã¿ã€ãã°ã©ãã£ãã¬ã€ã¢ãŠããšããŒãžã¬ã€ã¢ãŠããžã®æ³šæã
- 䟿å©ã§æ©èœçãªç®¡çããã«ã®äœæãéèŠã
- è·å Žã§ã®ã·ã¹ãã ã®è¿ éãªå±éãšãµãŒããŒãžã®ç°¡åãªå ¬éã
åœåãOrchardãšãã®ãœãŒã¹ã³ãŒãã¯ç¡æã®MS-PLã©ã€ã»ã³ã¹ã«åºã¥ããŠã©ã€ã»ã³ã¹ãããŠããŸããããæåã®ãããªãã¯ããŒãžã§ã³ã®ãªãªãŒã¹ã«ããããããžã§ã¯ãã¯ã©ã€ã»ã³ã¹ãããã·ã³ãã«ã§ããåºç¯ãªNew BSDã©ã€ã»ã³ã¹ã«å€æŽããŸããã
Orchard CMSãããŒãžã§ã³1.0ã«éãããŸã§ã4ã€ã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ããã®å¹Žã«ãªãªãŒã¹ãããŸããã ãã®éãã£ãšãéçºè ã¯ã³ãã¥ããã£ãšé£çµ¡ãåãåããèŠæãåãå ¥ããã³ã¡ã³ããèæ ®ããèŠã€ãã£ããšã©ãŒãä¿®æ£ããŸããã ãœãŒã¹ã³ãŒããå ¬éãããŠãŒã¶ãŒã®ãã£ãŒãããã¯ãåéããããã«ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãããŒã¿ã«codeplex.comã®orchard.codeplex.comã§ãããžã§ã¯ããéå§ãããŸãã ã
ä»æ¥ãOrchard CMSã®äœ¿çšã®ããããåŽé¢ã«é¢ããèšå€§ãªããã¥ã¡ã³ããèŠã€ããããšãã§ããŸãããã©ãŒã©ã ã§ãããžã§ã¯ãã®ãã£ã¹ã«ãã·ã§ã³ã«åå ã§ããŸããæ€åºããããšã©ãŒã«é¢ããã¬ããŒãããã°ãã©ãã«ãŒã«éä¿¡ã§ããŸããææ°ã®ãããžã§ã¯ããœãŒã¹ã³ãŒããšãã€ããªã¢ã»ã³ããªãããŠã³ããŒãã§ããŸãã
éçºè ããŒãžã«å ããŠã httpïŒ//www.orchardproject.net/ã«ãããããžã§ã¯ãã®å ¬åŒWebãµã€ããéå§ãããŸãããããã«ã¯ãä»æ¥ãOrchard CMSãæäœããããã«å¿ èŠãªãã¹ãŠã®ãµããŒãããã¥ã¡ã³ããå«ãŸããŠããŸãã ããã«ãå ¬åŒWebãµã€ãã«ã¯ãOrchard CMSã®æ©èœãæ¡åŒµããããã«ã³ãã¥ããã£ãäœæããã¢ãžã¥ãŒã«ããã³ãã®ä»ã®ã³ã³ããŒãã³ãã®ã®ã£ã©ãªãŒãå«ãŸããŠããŸãã
æ€èšŒçµæ
.csæ¡åŒµåãæã€ãã¹ãŠã®ãœãŒã¹ãã¡ã€ã«ïŒ3739åïŒ ãã¹ãã£ã³ã«é¢äžããŸãã ã åèšã§ã214,564è¡ã®ã³ãŒããå«ãŸããŠããŸããã

ç£æ»çµæã«åºã¥ããŠã137件ã®èŠåãåä¿¡ãããŸããã ããã«è©³çŽ°ã«æ€èšãããšãæåã®ïŒé«ïŒã¬ãã«ã§39ã®èŠåãåä¿¡ãããŸããã ãããã®28ã¯ãåé¡é åãŸãã¯ãšã©ãŒãæ確ã«ç€ºããŸããã 2çªç®ã®ã¬ãã«ïŒå¹³åïŒã§ã¯ã60ã®èŠåãåä¿¡ãããŸããã ç§ã®äž»èŠ³çãªæèŠã§ã¯ã31åã®èŠåããšã©ãŒãã¿ã€ããã¹ã®ããå Žæãæ£ãã瀺ããŠããŸããã 3çªç®ã®ïŒäœïŒã¬ãã«ã®èŠåã¯èæ ®ããŸããããããã¯äœã¬ãã«ã®ä¿¡é Œæ§ãæã€èŠåã§ãããååãšããŠå€ãã®èª€æ€ç¥ãããããå€ãã®çš®é¡ã®ãããžã§ã¯ãã«é¢é£ããªãèŠåãããããã§ãã
ãã®ãããèŠã€ãã£ããšã©ãŒã®äžã§æãèå³æ·±ããã®ãæ€èšãå§ããŸãã ãã詳现ã«ã¯ããããžã§ã¯ãã®äœæè ã¯ãäžæçãªã©ã€ã»ã³ã¹ããªã¯ãšã¹ãããæ€èšŒãå®äºããããšã«ããããšã©ãŒã調æ»ã§ããŸãã
ãŸããç§ãç解ããŠããããã«ãOrchard CMSã®éçºè ã¯ãããžã§ã¯ãã®äœæ¥ã§ãã§ã«ReSharperã䜿çšããŠããŸãã ç§ã¯ãã®çµè«ã以äžã«åºã¥ããŠæããŸãã
» Https://github.com/OrchardCMS/Orchard-Harvest-Website/blob/master/src/Orchard.4.5.resharper
ReSharperãšPVS-Studioã¯ç°ãªãçš®é¡ã®ããŒã«ã§ãããããããããæ¯èŒãããšããèãã¯å¥œãŸãããããŸããã ãã ããã芧ã®ãšãããReSharperã䜿çšããŠããã³ãŒãå ã®å®éã®ãšã©ãŒãæ€åºã§ããŸãã
ç¡éååž°

V3110 'ReturnTypeCustomAttributes'ããããã£å ã®ç¡éååž°ã®å¯èœæ§ã ContentItemAlteration.cs 121
public override ICustomAttributeProvider ReturnTypeCustomAttributes { get { return ReturnTypeCustomAttributes; } }
ããªãäžè¬çãªã¿ã€ããã¹ã§ãšã©ãŒã®ãªã¹ããéããŸããReturnTypeCustomAttributesããããã£ã®å€ãååŸãããšãç¡éååž°ãçºçããçµæãšããŠStackOverflowäŸå€ãã¹ããŒãããããã°ã©ã ã®ãã¯ã©ãã·ã¥ããçºçããŸãã ã»ãšãã©ã®å Žåãããã°ã©ãã¯ããããã£ã®_dynamicMethodãªããžã§ã¯ãããåããã£ãŒã«ããè¿ããããšæã£ãŠããã®ã§ ãæ£ãããªãã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
public override ICustomAttributeProvider ReturnTypeCustomAttributes { get { return _dynamicMethod.ReturnTypeCustomAttributes; } }
ãããŠãç¡éååž°ã«ã€ãªãããçµæãšããŠStackOverflowäŸå€ãã¹ããŒããå¥ã®ã¿ã€ããã¹ããããŸãã
V3110 'IsDefined'ã¡ãœããå ã§ç¡éååž°ãçºçããå¯èœæ§ããããŸãã ContentItemAlteration.cs 101
public override bool IsDefined(Type attributeType, bool inherit) { return IsDefined(attributeType, inherit); }
ãã®å Žåã IsDefinedã¡ãœããã¯èªåèªèº«ãåŒã³åºããŸãã ããã§ãããã°ã©ãã¯_dynamicMethodãªããžã§ã¯ãã§åãååã®ã¡ãœãããåŒã³åºãããšãæãã§ãããšæããŸãã æ£ãããªãã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
public override bool IsDefined(Type attributeType, bool inherit) { return _dynamicMethod.IsDefined(attributeType, inherit); }
åãåžžã«60ç§ã§ã¯ãªãå Žå

TimeSpanã®V3118ç§ã³ã³ããŒãã³ãã䜿çšãããŸãããããã¯å®å šãªæéééãè¡šããŠããŸããã 代ããã«ãTotalSecondsãå€ãæå³ãããŠããå¯èœæ§ããããŸãã AssetUploader.cs 182
void IBackgroundTask.Sweep() { .... // Don't flood the database with progress updates; // Limit it to every 5 seconds. if ((_clock.UtcNow - lastUpdateUtc).Seconds >= 5) { .... } }
TimeSpanåã®ããã»ã©æçœã§ã¯ãªãå®è£ ã®ããã«çºçããå¥ã®ããªãäžè¬çãªã¿ã€ããã¹ã ã³ã¡ã³ããããåã®ãªã¯ãšã¹ããã5ç§æªæºãçµéããå Žåããã®ã¡ãœããã¯ããŒã¿ããŒã¹ã¯ãšãªããããã¯ããå¿ èŠãããããšãããããŸãã ããããããã°ã©ãã¯ã TimeSpanåã®ãªããžã§ã¯ãã®Secondsããããã£ããæå®ãããæéééã®åèšç§æ°ã§ã¯ãªããæ®ãã®ç§æ°ãè¿ãããšãç¥ããªãã£ãããã§ãã
ããšãã°ãæéã1å4ç§ã®å Žåã Secondsã¡ãœãããåŒã³åºããŠã4ç§ããè¿ãããŸããã åèšç§æ°ãè¿ãå¿ èŠãããå Žåã¯ã TotalSecondsããããã£ã䜿çšããå¿ èŠããããŸãã ãã®äŸã§ã¯ã64ç§ã«ãªããŸãã
æ£ããããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
void IBackgroundTask.Sweep() { .... // Don't flood the database with progress updates; // Limit it to every 5 seconds. if ((_clock.UtcNow - lastUpdateUtc).TotalSeconds >= 5) // <= { .... } }
ã¹ã€ããããã§ãã¯ãããšãã«åæå€ããããŸãã

V3002 switchã¹ããŒãã¡ã³ãã¯ã 'TypeCode'åæåã®ãã¹ãŠã®å€ãã«ããŒããŠããŸããïŒãã€ãã InfosetFieldIndexingHandler.cs 65
public enum TypeCode { Empty = 0, Object = 1, DBNull = 2, Boolean = 3, Char = 4, SByte = 5, Byte = 6, Int16 = 7, UInt16 = 8, Int32 = 9, UInt32 = 10, Int64 = 11, UInt64 = 12, Single = 13, Double = 14, Decimal = 15, DateTime = 16, String = 18 } public InfosetFieldIndexingHandler(....) { .... var typeCode = Type.GetTypeCode(t); switch (typeCode) { case TypeCode.Empty: case TypeCode.Object: case TypeCode.DBNull: case TypeCode.String: case TypeCode.Char: .... break; case TypeCode.Boolean: .... break; case TypeCode.SByte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: .... break; case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: .... break; case TypeCode.DateTime: .... break; } }
ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã¯ããªãæ±ãã«ããããããšã©ãŒã«ããã«æ°ä»ãã®ã¯å°é£ã§ãã ãã®å Žåã TypeCodeåæãšã typeCodeå€æ°ãã©ã®åæèŠçŽ ã«å±ãããããã§ãã¯ããInfosetFieldIndexingHandlerã¡ãœããããããŸãã ãã®å Žåããã®ã³ãŒããæžããããã°ã©ããŒã¯ãããããByteãšããååã®1ã€ã®å°ããªèŠçŽ ãå¿ããŠããŸããããå ã®SByteãè¿œå ããŸããã ãã®ãšã©ãŒã®ããã ãã€ãåã®åŠçã¯ç¡èŠãããŸãã ããã°ã©ããæªåŠçã®åæèŠçŽ ã«ã€ããŠäŸå€ãã¹ããŒãããããã©ã«ãã®ãããã¯ãè¿œå ããå Žåããã®ãšã©ãŒãåé¿ããæ¹ãç°¡åã§ã ã
Exceptã¡ãœããããã®æ»ãå€ã®åŠçãªã

V3010é¢æ°ãExceptãã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã AdminController.cs 140
public ActionResult Preview(string themeId, string returnUrl) { .... if (_extensionManager.AvailableExtensions() .... } else { var alreadyEnabledFeatures = GetEnabledFeatures(); .... alreadyEnabledFeatures.Except(new[] { themeId }); // <= TempData[AlreadyEnabledFeatures] = alreadyEnabledFeatures; } .... }
ãåãã®ããã«ã Exceptã¡ãœããã¯ãå¥ã®ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãšåŒã°ããã³ã¬ã¯ã·ã§ã³ããé€å€ããŸãã ããããããã°ã©ãã¯ããã®ã¡ãœããã®çµæãæ°ããã³ã¬ã¯ã·ã§ã³ãè¿ããšããäºå®ãç¥ããªãã£ããããŸãã¯æ³šæãæã£ãŠããªãããã§ãã æ£ããããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
alreadyEnabledFeatures = alreadyEnabledFeatures.Except(new[] { themeId });
éšåæååã¡ãœããã¯è² ã®å€ãåãå ¥ããŸãã
V3057 ' Substring 'é¢æ°ã¯ãè² ã§ãªãå€ãæåŸ ãããŠãããšãã« '-1'å€ãåãåãå¯èœæ§ããããŸãã 2çªç®ã®åŒæ°ã調ã¹ãŸãã ContentIdentity.cs 139
.... GetIdentityKeyValue(....) { .... var indexOfEquals = identityEntry.IndexOf("="); if (indexOfEquals < 0) return null; var key = identityEntry.Substring(1, indexOfEquals - 1); .... }
å€æ°indexOfEqualsã®ãã§ãã¯ã«æ³šæããŠãã ãã ã å€æ°å€ãè² ã®å Žåããã§ãã¯ã¯ã±ãŒã¹ãä¿è·ããŸãã ãã ããnullå€ã«å¯Ÿããä¿è·ã¯ãããŸããã
ã·ã³ãã« '='ãå é ã«ããå Žåã SubstringïŒïŒã¡ãœããã®2çªç®ã®åŒæ°ã¯-1ã®è² ã®å€ãæã€ãããäŸå€ãçºçããŸãã
åæ§ã®ãšã©ãŒãèŠã€ãããŸããããããã¯å¥ã«æå³ããããŸããã
- V3057 'Substring'é¢æ°ã¯ãè² ã§ãªãå€ãæåŸ ãããŠãããšãã« '-1'å€ãåãåãå¯èœæ§ããããŸãã 2çªç®ã®åŒæ°ã調ã¹ãŸãã CommandParametersParser.cs 18
- V3057 'Substring'é¢æ°ã¯ãè² ã§ãªãå€ãæåŸ ãããŠãããšãã« '-1'å€ãåãåãå¯èœæ§ããããŸãã 2çªç®ã®åŒæ°ã調ã¹ãŸãã CommandStep.cs 73
åŒã®åªå æäœ

V3022åŒ 'localPart.Name + "ã" + localField.Name + "ã" + storageName 'ã¯åžžã«nullã§ã¯ãããŸããã ContentFieldProperties.cs 56
localPart.Name + "." + localField.Name + "." + storageName ?? ""
ãã®å Žåãããã°ã©ããŒã¯ãããããªãã¬ãŒã¿ãŒãšæã£ãã§ãããã?? nullã®storageNameå€æ°ã®ã¿ããã§ãã¯ããããã§ããã°ã空ã®æååã代ããã«åŒã«è¿œå ãããŸãã ãã ãã +æŒç®åã®åªå 床ãé«ããããåŒå šäœã®nullããã§ãã¯ãããŸã ã ãŸãã nullãè¡ã«è¿œå ãããå Žåãå€æŽãªãã§åãè¡ãååŸããããšã«ã泚æããŠãã ããã ãããã£ãŠããã®å Žåããã®ãã§ãã¯ãäžèŠã§èª€è§£ãæããã®ãšããŠå®å šã«ç Žæ£ã§ããŸãã ä¿®æ£ããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
localPart.Name + "." + localField.Name + "." + storageName
ã¢ãã©ã€ã¶ãŒã¯å¥ã®åæ§ã®ãšã©ãŒãæ€åºããŸããã
V3022 Expression 'localPart.Name + "." + localField.Name + "." + storageName' is always not null. ContentFieldsSortCriteria.cs 53
æ€èšŒã¯åžžã«åœã§ãã
V3022åŒ 'i == 4'ã¯åžžã«falseã§ãã WebHost.cs 162
public void Clean() { // Try to delete temporary files for up to ~1.2 seconds. for (int i = 0; i < 4; i++) { Log("Waiting 300msec before trying to delete ...."); Thread.Sleep(300); if (TryDeleteTempFiles(i == 4)) { Log("Successfully deleted all ...."); break; } } }
ã«ãŒãã€ãã¬ãŒã¿iã®å€ã¯åžžã«0ã3ã®ç¯å²ã«ããããšãããããŸãããã«ãŒãæ¬äœå ã®ããã°ã©ãã¯ãã€ãã¬ãŒã¿ã®å€ã4ãã©ããã倧èã«ãã§ãã¯ããŸãããã®ãã§ãã¯ã¯ããã®ã»ã¯ã·ã§ã³ã®çã®ç®çã³ãŒãã§ã¯ããã®ãšã©ãŒããããžã§ã¯ãã®èŠæš¡ã§ã©ãã»ã©å±éºã§ããããèšãã®ã¯é£ããã§ãã
ã¢ãã©ã€ã¶ãŒã¯ãå€ãã®åæ§ã®ãšã©ãŒãæ€åºããŸããã ãããã®ãã¹ãŠã¯ãæ€èšŒãåžžã«çãŸãã¯åœã®ããããã§ãããšèšããŸãã
- V3022åŒ 'result == null'ã¯åžžã«falseã§ãã ContentFieldDriver.cs 175
- V3022åŒ 'String.IsNullOrWhiteSpaceïŒurlïŒ'ã¯åžžã«trueã§ãã GalleryController.cs 93
- V3022åŒ '_smtpSettings.HostïŒ= Null'ã¯åžžã«trueã§ãã SmtpMessageChannel.cs 143
- V3022åŒ 'loop'ã¯åžžã«falseã§ãã IndexingTaskExecutor.cs 270
- V3022åŒ 'Convert.ToStringïŒShape.ValueïŒ'ã¯åžžã«nullã§ã¯ãããŸããã EditorShapes.cs 372
- V3022åŒ 'ModelState.IsValid'ã¯åžžã«trueã§ãã RecycleBinController.cs 81
- V3022åŒ 'previousXmlïŒ= Null'ã¯åžžã«trueã§ãã ContentDefinitionEventHandler.cs 104
- V3022åŒ 'previousXmlïŒ= Null'ã¯åžžã«trueã§ãã ContentDefinitionEventHandler.cs 134
- V3022åŒ 'layoutIdïŒ= Null'ã¯åžžã«trueã§ãã ProjectionElementDriver.cs 120
ãªããžã§ã¯ãã®nullããã§ãã¯ããåã«ã¯ã©ã¹ã¡ã³ããŒã䜿çšãã
V3027å€æ° 'x.Container'ã¯ãåãè«çåŒã®ãã«ã«å¯ŸããŠæ€èšŒãããåã«ãè«çåŒã§äœ¿çšãããŸããã ContainerService.cs 130
query.Where(x => (x.Container.Id == containerId || x.Container == null) && ids.Contains(x.Id));
äžèšã®ã³ãŒããããããããã«ïŒ2è¡ç®ãš3è¡ç®ã«èå³ããããŸãïŒãããã°ã©ããŒã¯ãŸãã³ã³ãããŒã®Idããããã£ãžã®ã¢ã¯ã»ã¹ããã§ãã¯ãããã®åŸã³ã³ãããŒã®nullããã§ãã¯ããŸã ã æ£ãããªãã·ã§ã³ã¯ãæåã«nullããã§ãã¯ããŠãããã³ã³ããã®èŠçŽ ã«ã¢ã¯ã»ã¹ããããšã§ãã
次ã®ã±ãŒã¹ã¯åã®ã±ãŒã¹ã«äŒŒãŠããŸãã èªåã§ãšã©ãŒãèŠã€ããŠãã ããã
V3095 ãããªã²ãŒãããªããžã§ã¯ãã¯ãnullãšç §åãããåã«äœ¿çšãããŸããã è¡ã確èªããŠãã ããïŒ37ã40ãSerializableDelegate.cs 37
void ISerializable.GetObjectData( SerializationInfo info, StreamingContext context) { info.AddValue("delegateType", Delegate.GetType()); .... if (.... && Delegate != null) { .... } }
ã¢ãã©ã€ã¶ãŒã¯ãäžèšã®ãšã©ãŒãšåæ§ã®2ã€ã®é¡äŒŒãããšã©ãŒãçºèŠãããããããããåŒçšããŸããã
- V3095ãããªã²ãŒãããªããžã§ã¯ãã¯ãnullãšç §åãããåã«äœ¿çšãããŸããã è¡ã確èªããŠãã ããïŒ37ã40ãSerializableDelegate.cs 37
- V3095 nullã«å¯ŸããŠæ€èšŒãããåã«ãããŠã£ãžã§ããããªããžã§ã¯ãã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ81ã93ãTagsWidgetCommands.cs 81
ãããã«

ãã®ãããžã§ã¯ãã§ã¯ããã®ä»ã®ãšã©ãŒãã¿ã€ããã¹ãæ¬ ç¹ãèŠã€ãããŸããã ãããã圌ãã¯èšäºã§ãããã説æããã®ã«ç§ã«ã¯ååã«é¢çœããªãã£ãã Orchard CMSéçºè ã¯ã PVS-StudioããŒã«ã䜿çšããŠãã¹ãŠã®æ¬ ç¹ãç°¡åã«èŠã€ããããšãã§ããŸãã äžèšã§ææ¡ããéçã¢ãã©ã€ã¶ãŒã䜿çšããŠããããžã§ã¯ãã®ãšã©ãŒãæ€çŽ¢ããããšãã§ããŸãã
éç解æã®äž»ãªå©ç¹ã¯ãå®æçã«äœ¿çšããããšã§ãã ã³ãŒããããŠã³ããŒãããŠäžåºŠã ã確èªããŸã-ããã¯æ·±å»ãªåé¡ã§ã¯ãããŸããã ããšãã°ãããã°ã©ãã¯ã³ã³ãã€ã©ã®èŠåãå®æçã«ç£èŠãããªãªãŒã¹ã®1ã€åã«3幎ããšã«èŠåããªã³ã«ããŸããã éåžžã®äœ¿çšã§ã¯ãéçã¢ãã©ã€ã¶ãŒã¯ã¿ã€ããã¹ããšã©ãŒã®æ€çŽ¢ã«ãããæéãå€§å¹ ã«ç¯çŽããŸãã
PSãã®ãã¥ãŒã¹ãèŠéããæ¹ã®ããã«ãPVS-StudioãSonarQubeãšçµ±åã§ããããã«ãªã£ãããšããç¥ããããŸãã ãã®ããŒãã«é¢ããèšäºïŒã SonarQubeãã©ãããã©ãŒã ã䜿çšããŠã³ãŒãã®å質ã管çããŸã ãã
è±èªã話ãèŽè¡ãšãã®èšäºãå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒIvan Kishchenkoã Orchard CMSã®ãã°ã®åæ ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã