C / C ++èšèªçšã®PVS-Studioã¢ãã©ã€ã¶ãŒãäœæããéçºãç¶ç¶ããŠããŸãã æéãçµã€ã«ã€ããŠãå®è£ ããã蚺æã®å€ããç¹å®ã®ããã°ã©ãã³ã°èšèªãšã¯ç¡é¢ä¿ã§ããããšãæããã«ãªãããã®åŸãçµéšãå¥ã®ããã°ã©ãã³ã°èšèªãCïŒã«é©çšããããšããããšã«ããŸããã ãã®èšäºã§ã¯ãæ°ããCïŒã¢ãã©ã€ã¶ãŒã䜿çšããMicrosoftã®Code Contractsãããžã§ã¯ãã®ãã¹ãã«ã€ããŠèª¬æããŸãã
MSã³ãŒãå¥çŽã«ã€ããŠ
ã³ãŒãã³ã³ãã©ã¯ãã¯ã.NETã¢ããªã±ãŒã·ã§ã³ã®ããã°ã©ã ã³ãŒãã«é¢ããä»®å®ãè¡šçŸããæ¹æ³ãæäŸããŸãã å¥çŽã¯åææ¡ä»¶ãäºåŸæ¡ä»¶ãããã³ãªããžã§ã¯ãäžå€åŒã®åœ¢åŒãåããå€éšããã³å éšAPIã®æ€èšŒæžã¿ããã¥ã¡ã³ããšããŠæ©èœããŸãã å¥çŽã¯ãããã°ã©ã ã®å®è¡äžã«ãã§ãã¯ããããšã§ãã¹ãããã»ã¹ãæ¹åããããã«äœ¿çšãããå¥çŽã®éçãªæ€èšŒãšããã¥ã¡ã³ãã®çæãå¯èœã«ããŸãã
ããã¯ã掻çºã«éçºãããŠããäžèŠæš¡ã®ãããžã§ã¯ãïŒçŽ4000åã®ãœãŒã¹ãã¡ã€ã«ïŒã§ããæªå®æã§èª€ã£ãŠèšè¿°ãããã³ãŒããå€æ°å«ãŸããŠããŸãã ãã®æ®µéã§ãéçºããã»ã¹ã«éçåæãå°å ¥ããå¿ èŠããããŸãã
æ°ããCïŒã³ãŒãã¢ãã©ã€ã¶ãŒã«ã€ããŠ
Code Contractsãããžã§ã¯ãã¯ã PVS-Studioã®å®éšçã䜿çšããŠæ€èšŒãããŸãããããã¯ããªã³ã¯http://files.viva64.com/beta/PVS-Studio_setup.exeããå ¥æã§ããŸãã
ã¢ãã©ã€ã¶ãŒã¯ããã«å®éšçã§ã¯ãªããªããŸãã 2015幎12æ22æ¥ã«CïŒããµããŒãããPVS-Studioã®æåã®ãªãªãŒã¹ããŒãžã§ã³ããªãªãŒã¹ããäºå®ã§ãã åæã«ãã¢ãã©ã€ã¶ãŒã¯ã¡ãžã£ãŒããŒãžã§ã³çªå·ã6.0ã«å€æŽããŸãã
äŸ¡æ Œèšå®ããªã·ãŒã¯å€æŽãããŸããã 以åãPVS-Studioã§ã¯ãCãC ++ãC ++ / CLIãC ++ / CXã®ããã°ã©ã ããã§ãã¯ã§ããŸããã ããã§ãCïŒããã®ãªã¹ãã«è¿œå ãããŸãã
æ€èšŒçµæ
éããŠãããããžã§ã¯ãã®ãã§ãã¯ã«é¢ããèšäºã®æºåäžã«ãéçã¢ãã©ã€ã¶ãŒãæäŸãããã¹ãŠã®èŠåãšã¯ãŸã£ããç°ãªãæ å ±ãæäŸããŸãã ãããã£ãŠããããžã§ã¯ãã®äœæè ããããžã§ã¯ããåå¥ã«åæããã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžã調æ»ããããšããå§ãããŸãã
èŠã€ãã£ãæãå±éºãªå Žæ
V3025圢åŒãæ£ãããããŸãã ã 'Format'é¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ3.çŸåšïŒ2. VSServiceProvider.cs 515
void AskToReportError(Exception exn) { .... var emailBody = new StringBuilder(); emailBody.AppendLine("Hi Code Contracts user,"); emailBody.AppendLine(); .... emailBody.AppendLine( String.Format(".... {0} {1} Visual Studio {2} Bug Report", typeof(VSServiceProvider).Assembly.GetName().Version, #if DEBUG "Debug" #else "Release" #endif )); .... }
String.FormatïŒïŒé¢æ°ã¯3ã€ã®åŒæ°ãå¿ èŠãšãã2ã€ã®åŒæ°ã®ã¿ãæž¡ãããŸãã ãã®å Žåã FormatExceptionãã¹ããŒãããŸãã
V3014 ãforãæŒç®åå ã§èª€ã£ãå€æ°ãã€ã³ã¯ãªã¡ã³ããããŠããå¯èœæ§ããããŸãã ãiãã®æ€èšãæ€èšããŠãã ããã SparseArray.cs 1956
override public string ToString() { StringBuilder str = new StringBuilder(); for (int i = 0; i < data.Length; i++) { if (data[i] != null) { for (int j = 0; j < lastElement[i]; i++) //<== { str.AppendFormat("({0},{1})", data[i][j].Index, data[i][j].Value); } } } return str.ToString(); }
ãã¹ããããã«ãŒãã§ã¯ãã«ãŠã³ã¿ãŒå€æ°ãjãã¯å€æŽãããŸããã ãj ++ãã®ä»£ããã«ãå€éšã«ãŒããi ++ãã®ã«ãŠã³ã¿ãŒãå€æŽãããŸãã
䌌ããããªå ŽæïŒ
- V3014ãforãæŒç®åå ã§èª€ã£ãå€æ°ãã€ã³ã¯ãªã¡ã³ããããŠããå¯èœæ§ããããŸãã ãkãã®èŠçŽããæ€èšããŠãã ããã Writer.cs 3984
- V3014ãforãæŒç®åå ã§èª€ã£ãå€æ°ãã€ã³ã¯ãªã¡ã³ããããŠããå¯èœæ§ããããŸãã ãcount_dãã®ç¢ºèªãæ€èšããŠãã ããã Octagons.cs 509
V3003 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã 203ã207è¡ã確èªããŠãã ãããWeakestPreconditionProver.csToSMT2.cs 203
private BoxedExpression DeclareVariable(....) { var tmp = original.ToString().Replace(' ', '_'); this.Info.AddDeclaration(string.Format("....", tmp, type)); this.ResultValue = tmp; if (type == FLOAT32) //<== { types[original] = FloatType.Float32; } else if (type == FLOAT64) //<== { types[original] = FloatType.Float64; } return original; }
ã¢ãã©ã€ã¶ãŒã¯2ã€ã®åäžã®æ¡ä»¶åŒãæ€åºããŸããããã®ããã2çªç®ã®æ¡ä»¶ã®ãªãã¬ãŒã¿ãŒã¯å¶åŸ¡ãååŸã§ããŸããã äžèŠããã§ã¯ãããŸããããå®æ°FLOAT32ããã³FLOAT64ãå®çŸ©ãç¶ãããšã次ã®ã³ãŒãã衚瀺ãããŸãã
private const string FLOAT32 = "(_ FP 11 53)"; // To change!!! private const string FLOAT64 = "(_ FP 11 53)";
å®æ°ã¯æ¬åœã«çããã§ãïŒ ããã«ã¯FLOAT32å®æ°ã®å€ã眮ãæããå¿ èŠããããšããã³ã¡ã³ãããããŸããããã®å Žæã¯å°æ¥èŠéããããã§ãã ãããžã§ã¯ãã®éçºã§ã¯ãTODOãªã©ã®å Žæã«ã¿ã°ãä»ããŠãéçã³ãŒãåæã®çµæãå®æçã«ç¢ºèªããããšãéèŠã§ãã
V3003 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ããã§ãã¯ããŠãã ããïŒ1200ã1210ãOutputPrettyCS.cs 1200
public enum TypeConstraint { NONE, CLASS, //<== STRUCT, //<== BASECLASS, } public void Output(OutputHelper oh) { Contract.Requires(oh != null); oh.Output("where ", false); mParent.OutputName(oh); oh.Output(" : ", false); //** base class bool comma = false; if (mTypeConstraint == TypeConstraint.CLASS) //<==??? { oh.Output("class", false); comma = true; } else if (mTypeConstraint == TypeConstraint.STRUCT) { oh.Output("struct", false); comma = true; } else if (mTypeConstraint == TypeConstraint.CLASS) //<==??? { oh.Output(mClassConstraint, false); comma = true; } }
ãã®ã³ãŒãã§ã¯ãåãæ¡ä»¶ãããæçœã§ãã ãããããããããã®æ¡ä»¶ã§ãå€æ° 'mTypeConstraint'ãTypeConstraint.CLASSã®ä»£ããã«å®æ°TypeConstraint.BASECLASSãšæ¯èŒããããšèããŠããŸããã
V3022åŒ 'c>' \ xFFFF ''ã¯åžžã«falseã§ãã Output.cs 685
private static string Encode(string s) { .... foreach( char c in s ) { if (c == splitC || c == '\n' || c == '\\') { specialCount++; } else if (c > '\x7F') { if (c > '\xFFFF') specialCount += 9; else specialCount += 5; } } .... }
åŒãc> '\ xFFFF'ãã¯æ±ºããŠçã«ãªãããæŒç®åãspecialCount + = 9ãã¯å®è¡ãããŸããã å€æ° 'cââ'ã¯Charåã§ãæ倧å€ã¯ '\ xFFFF'ã§ãããã®ã³ãŒããã©ã®ããã«æ©èœããã©ã®ããã«ä¿®æ£ãããã¯æ確ã§ã¯ãããŸããããããããã¿ã€ããã¹ãŸãã¯å¥ã®èšèªã®ã¢ããªã±ãŒã·ã§ã³ããåçšããã³ãŒããæ±ã£ãŠããŸããããšãã°ãC / C ++èšèªã§ã¯ã32ãããæåã䜿çšãããããšããããå€0xFFFFã§ãåçããããŸãããã®ãããªã³ãŒãã®äŸïŒ
/* putUTF8 -- write a character to stdout in UTF8 encoding */ static void putUTF8(long c) { if (c <= 0x7F) { /* Leave ASCII encoded */ printf("&#%ld;", c); } else if (c <= 0x07FF) { /* 110xxxxx 10xxxxxx */ putchar(0xC0 | (c >> 6)); putchar(0x80 | (c & 0x3F)); } else if (c <= 0xFFFF) { /* 1110xxxx + 2 */ putchar(0xE0 | (c >> 12)); putchar(0x80 | ((c >> 6) & 0x3F)); putchar(0x80 | (c & 0x3F)); } else if (c <= 0x1FFFFF) { /* 11110xxx + 3 */ putchar(0xF0 | (c >> 18)); putchar(0x80 | ((c >> 12) & 0x3F)); putchar(0x80 | ((c >> 6) & 0x3F)); putchar(0x80 | (c & 0x3F)); } else if (c <= 0x3FFFFFF) { /* 111110xx + 4 */ putchar(0xF8 | (c >> 24)); putchar(0x80 | ((c >> 18) & 0x3F)); putchar(0x80 | ((c >> 12) & 0x3F)); putchar(0x80 | ((c >> 6) & 0x3F)); putchar(0x80 | (c & 0x3F)); } else if (c <= 0x7FFFFFFF) { /* 1111110x + 5 */ putchar(0xFC | (c >> 30)); putchar(0x80 | ((c >> 24) & 0x3F)); putchar(0x80 | ((c >> 18) & 0x3F)); putchar(0x80 | ((c >> 12) & 0x3F)); putchar(0x80 | ((c >> 6) & 0x3F)); putchar(0x80 | (c & 0x3F)); } else { /* Not a valid character... */ printf("&#%ld;", c); } }
V3008 ãthis.InsideMonitorãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ751ã749ãAssertionCrawlerAnalysis.cs 751
private Data(Data state, Variable v) { this.IsReached = state.IsReached; this.InsideMonitor = state.InsideMonitor; //<== this.symbols = new List<Variable>(state.symbols) { v }; this.InsideMonitor = false; //<==??? }
ç¹å®ã®é¢æ°ãé¢æ°ã®ãã©ã¡ãŒã¿ãŒãä»ããŠæž¡ãããå€ã䜿çšããŠãªããžã§ã¯ãã®ç¶æ ãå€æŽããæåŸã«ãthis.InsideMonitorããã£ãŒã«ãã®å€ãå®æ°ãfalseãã§äžæžãããããšã¯éåžžã«çãããã§ãã å²ãåœãŠãthis.InsideMonitor = state.InsideMonitorãã¯æ¢ã«å®è¡æžã¿ã§ãã
V3009ãã®ã¡ãœãããåžžã«ãtrueããšããåãå€ãè¿ãã®ã¯å¥åŠã§ãã LinearEqualities.cs 5262
public bool TryGetFirstAvailableDimension(out int dim) { for (var i = 0; i < map.Length; i++) { if (!map[i]) { dim = i; return true; } } map.Length++; dim = map.Length; return true; }
ã¢ãã©ã€ã¶ãŒã¯ãåžžã«åäžã®çã®å€ãè¿ãé¢æ°ãæ€åºããŸããã æ¡ä»¶ "ïŒMap [i]"ãæºããããå Žåãé¢æ°ã¯1ã€ã®å€ãè¿ããæ¡ä»¶ãäžåºŠãçã§ãªããã°ãå¥ã®å€ãè¿ããšæ³å®ã§ããŸãã ããããããã¯ééãã§ãã
ãã®ä»ã®èŠå
V3025圢åŒãæ£ãããããŸãã ã 'Format'é¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ1.çŸåšïŒ2. Output.cs 68
public override void WriteLine(string value) { output.WriteLine(string.Format("{1}", DateTime.Now, value.Replace("{", "{{").Replace("}","}}"))); //output.WriteLine(string.Format("[{0}] {1}", //DateTime.Now., value)); }
以åã¯ãString.FormatïŒïŒé¢æ°ã¯ãæ¥ä»ãšå€ã®2ã€ã®å€ãåãå ¥ããŠåºåããŠããŸããã 次ã«ããã®ã³ãŒãã«ã€ããŠã³ã¡ã³ãããã€ã³ããã¯ã¹0ã®åŒæ°ã䜿çšããªãå¥ã®ãªãã·ã§ã³ãäœæããŸããã æ¥ä»ã¯å°å·ãããªããªããŸããã
æªäœ¿çšã®åŒæ°ã§ãã©ãŒãããé¢æ°ãåŒã³åºãä»ã®äŸïŒ
- V3025圢åŒãæ£ãããããŸããã 'Format'é¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ6.çŸåšïŒ7. CacheModelExtensions.cs 46
- V3025圢åŒãæ£ãããããŸããã 'Format'é¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ1.çŸåšïŒ2. CodeFixesInference.cs 1608
- V3025圢åŒãæ£ãããããŸããã 'Format'é¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®å®åŒæ°ãäºæãããŸãã äºæ³ïŒ2.çŸåšïŒ3. ExpressionManipulation.cs 442
V3004 ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã Metadata.cs 2602
private void SerializeFieldRvaTable(....) { .... switch (row.TargetSection){ case PESection.SData: case PESection.TLS: Fixup fixup = new Fixup(); fixup.fixupLocation = writer.BaseStream.Position; fixup.addressOfNextInstruction = row.RVA; if (row.TargetSection == PESection.SData){ sdataFixup.nextFixUp = fixup; //<== sdataFixup = fixup; //<== }else{ sdataFixup.nextFixUp = fixup; //<== sdataFixup = fixup; //<== } writer.Write((int)0); break; .... }
ã¢ãã©ã€ã¶ãŒã¯ãæ¡ä»¶ã¹ããŒãã¡ã³ãã§åäžã®ã³ãŒããããã¯ãæ€åºããŸããã ããã¯åé·ã³ãŒãã§ããããã³ããŒåŸã«ã³ãŒãã®1ãããã¯ãå€æŽããã®ãå¿ããå¯èœæ§ããããŸãã Copy-Pasteã¯CïŒããã°ã©ããspare ãã¿ãŸããã
ãã®ãããªå Žæã®å šãªã¹ãïŒ
- V3004ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã Nodes.cs 6698
- V3004ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã Nodes.cs 6713
- V3004ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã WarningSuggestionLinkOutput.cs 108
- V3004ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã NonNullAnalyzer.cs 1753
V3001 ã||ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãsemanticType.Name == nullãããããŸãã æŒç®åã ContractsProvider.cs 694
public bool TryGetTypeReference(....) { .... if (semanticType.Name == null || semanticType.Name == null) goto ReturnFalse; cciType = new Microsoft.Cci.MutableCodeModel.NamespaceTypeR.... { ContainingUnitNamespace = cciNamespace, GenericParameterCount = (ushort) (....), InternFactory = Host.InternFactory, IsValueType = semanticType.IsValueType, IsEnum = semanticType.TypeKind == TypeKind.Enum, Name = Host.NameTable.GetNameFor(semanticType.Name), TypeCode=CSharpToCCIHelper.GetPrimitiveTypeCode(semanticType) }; goto ReturnTrue;' .... }
æ¡ä»¶ãsemanticType.Name == nullãã2åãã§ãã¯ãããŸãã ãã§ãã¯ã¯åé·ã§ãããåçŽåããããšãã§ããŸãããŸãã¯ããªããžã§ã¯ãã®å¥ã®ãã£ãŒã«ãããã§ãã¯ããã®ãå¿ããŸããã
ãã®ãããã¯ã«é¢ããå¥ã®èŠåïŒ
- V3001ã||ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãsemanticType.Name == nullãããããŸãã æŒç®åã ContractsProvider.cs 714
V3019 ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãotherãããrightãã確èªããŠãã ããã CallerInvariant.cs 189
public override Predicate JoinWith(Predicate other) { var right = other as PredicateNullness; if (other != null) { if (this.value == right.value) { return this; } } return PredicateTop.Value; }
ã¢ãã©ã€ã¶ãŒã¯ããã«åç §ãä»ããã¢ã¯ã»ã¹ã«ã€ãªããå¯èœæ§ã®ããæœåšçãªãšã©ãŒãæ€åºããŸããã ãasãæŒç®åã®å®è¡çµæããnullããšæ¯èŒããå¿ èŠããããŸãã
ãotherããªããžã§ã¯ããnullã§ã¯ãªãããPredicateNullnessãã¿ã€ãã«ãã£ã¹ãã§ããªãç¶æ³ãçºçããå Žåããright.valueãã«ã¢ã¯ã»ã¹ãããšãã«nullåç §ãä»ããŠã¢ã¯ã»ã¹ãè¡ãããŸãã
ãã®ãããžã§ã¯ãã«ã¯å€ãã®ãã®ãããªæ¯èŒããããŸããããã«ãªã¹ãå šäœããããŸãã
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ããã¡ã¯ããããmoreRefinedFactsãã確èªããŠãã ããã SimplePostconditionDispatcher.cs 319
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸããããã誀ã£ãå€æ°ãnullãšæ¯èŒãããŸãã å€æ°ãobjProvenanceãããprovenanceãã確èªããŸãã AssertionCrawlerAnalysis.cs 816
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãprevãããotherãã確èªããŠãã ããã NonRelationalValueAbstraction.cs 1063
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãprevãããcastedPrevãã確èªããŸãã GenericDomains.cs 1657
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãaãããrightãã確èªããŠãã ããã LinearEqualitiesForSubpolyhedra.cs 859
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸããããã誀ã£ãå€æ°ãnullãšæ¯èŒãããŸãã å€æ°ãaãããotherãã確èªããŠãã ããã NonRelationalValueAbstraction.cs 1047
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãaãããotherãã確èªããŠãã ããã NonRelationalValueAbstraction.cs 1055
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãaãããrightãã確èªããŠãã ããã LinearEqualities.cs 849
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãaãããrightãã確èªããŠãã ããã LinearEqualities.cs 973
- V3019ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãaãããrightãã確èªããŠãã ããã LinearEqualities.cs 1119
V3030å®æçãªãã§ãã¯ã ãthis.lineOffsets == nullãæ¡ä»¶ã¯ã612è¡ç®ã§æ¢ã«æ€èšŒãããŠããŸããNodes.cs 613
public virtual void InsertOrDeleteLines(....) { .... if (this.lineOffsets == null) if (this.lineOffsets == null) this.ComputeLineOffsets(); if (lineCount < 0) this.DeleteLines(offset, -lineCount); else this.InsertLines(offset, lineCount); .... }
2ã€ã®åäžã®ãã§ãã¯ãthis.lineOffsets == nullããé£ç¶ããŠå®è¡ããŸãã ãã®ãããªã³ãŒãã¯æå³ããããŸããã ããããä»ã®äœãããã§ãã¯ãããã£ãã®ã§ãããã
V3002 switchã¹ããŒãã¡ã³ãã¯ã 'UnaryOperator'åæåã®ãã¹ãŠã®å€ãã«ããŒããŠããŸããïŒConv_decã WeakestPreconditionProver.csToSMT2.cs 453
private string Combine(UnaryOperator unaryOperator, string arg) { Contract.Requires(arg != null); var format = "({0} {1})"; string op = null; switch (unaryOperator) { case UnaryOperator.Neg: case UnaryOperator.Not: case UnaryOperator.Not: { op = "not"; } break; case UnaryOperator.WritableBytes: case UnaryOperator.Conv_i: case UnaryOperator.Conv_i1: case UnaryOperator.Conv_i2: case UnaryOperator.Conv_i4: case UnaryOperator.Conv_i8: case UnaryOperator.Conv_r_un: case UnaryOperator.Conv_r4: case UnaryOperator.Conv_r8: case UnaryOperator.Conv_u: case UnaryOperator.Conv_u1: case UnaryOperator.Conv_u2: case UnaryOperator.Conv_u4: case UnaryOperator.Conv_u8: { return null; } } return string.Format(format, op, arg); }
ã¢ãã©ã€ã¶ãŒã¯ã 'switch'ã¹ããŒãã¡ã³ããæ€åºããŸããããã®ã¹ããŒãã¡ã³ãã§ã¯ããªãã·ã§ã³ãåæåå€æ°ã«ãã£ãŠéžæãããŠããŸãã åæã«ã1â UnaryOperatorã Conv_decãã ããã¯éåžžã«çãããã§ãã
以äžã¯ãUnaryOperatoråæã®å®çŸ©ã§ãã
public enum UnaryOperator { .... Conv_u8, Conv_r_un, Neg, Not, WritableBytes, Conv_dec, //<== }
èãããããšã©ãŒã¯ããã®é¢æ°ããUnaryOperator.Notããšããå€ã«å¯ŸããŠãã©ãŒããããããæååãè¿ãããã«å®è£ ãããŠããããšã§ãããä»ã®å Žåã«ã¯å€ã¯ãnullãã§ãã ãã ããèŠçŽ ã¯ãUnaryOperatorãã§ãã Conv_decãã¯ã¹ããããããå€æ° 'op'ã®å€ã¯ 'null'ã®ãŸãŸã«ãªããé¢æ°ãè¿ãæžåŒèšå®ãããæååã«åé¡ãããŸãã
ãããã«
ãã®èšäºãã楜ãã¿ãã ããã èå³æ·±ããªãŒãã³ãããžã§ã¯ãã®ãã§ãã¯ã§èªè ãåã°ãç¶ããããšãçŽæããŸãã
äžèšã®ããã«ãæåã®ãªãªãŒã¹ã¯2015幎12æ22æ¥ã«äºå®ãããŠããŸãã éåžžã幎æ«ã«å°æ¥ã®è³Œå ¥ã«é¢ãã決å®ãè¡ãããŸãã ãã®ãããèå³ã®ãããã¹ãŠã®äººã®ããã«ãPVS-Studioã®è²·åã«é¢ããŠä»ããé£çµ¡ããããšãé æ»ãªãæäŸããŸãã ãããŠãç§éã¯ç§éã®æºè¶³ãã顧客ã®éã§ããªãã®äŒç€ŸãèŠãããã«å¬ããã§ã ã
ãæž èŽããããšãããããŸããã ãããŠãããªãã®ã³ãŒãã¯çµ¶æçã§ãïŒ
è±èªã話ãèŽè¡ãšãã®èšäºãå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSvyatoslav Razmyslovã ãã€ã¯ããœããã³ãŒãå¥çŽã®åæ ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã