Orchardã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®éå¶å©ãªãŒãã³ãœãŒã¹ASP.NETã®ã£ã©ãªãŒã§ããOutercurve Foundationã®äžéšã§ããç¡æã®ãªãŒãã³ãœãŒã¹ã³ã³ãã³ã管çã·ã¹ãã ã§ãã
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.resharperReSharperãš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() { ....
TimeSpanåã®ããã»ã©æçœã§ã¯ãªãå®è£
ã®ããã«çºçããå¥ã®ããªãäžè¬çãªã¿ã€ããã¹ã ã³ã¡ã³ããããåã®ãªã¯ãšã¹ããã5ç§æªæºãçµéããå Žåããã®ã¡ãœããã¯ããŒã¿ããŒã¹ã¯ãšãªããããã¯ããå¿
èŠãããããšãããããŸãã ããããããã°ã©ãã¯ã
TimeSpanåã®ãªããžã§ã¯ãã®
Secondsããããã£ããæå®ãããæéééã®åèšç§æ°ã§ã¯ãªããæ®ãã®ç§æ°ãè¿ãããšãç¥ããªãã£ãããã§ãã
ããšãã°ãæéã1å4ç§ã®å Žåã
Secondsã¡ãœãããåŒã³åºããŠã4ç§ããè¿ãããŸããã åèšç§æ°ãè¿ãå¿
èŠãããå Žåã¯ã
TotalSecondsããããã£ã䜿çšããå¿
èŠããããŸãã ãã®äŸã§ã¯ã64ç§ã«ãªããŸãã
æ£ããããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
void IBackgroundTask.Sweep() { ....
ã¹ã€ããããã§ãã¯ãããšãã«åæå€ããããŸãã
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 });
ãåãã®ããã«ã
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() {
ã«ãŒãã€ãã¬ãŒã¿
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ã®ãã°ã®åæ ã