ã¯ããã«
ãã¹ãŠã®è¯ãäžæ¥ã
ãŸããçã人ã®ããã®å°ããªå 責äºé ïŒã¯ãããã®æçš¿ã§ã¯ããããããªãŒãã³ãªMicrosoft Orleansãããžã§ã¯ãããã¹ãããããã®PVS-Studioã®ã©ã€ã»ã³ã¹ãååŸããŸãã ãŸãã¯ãããããã©ã®ããã«èœã¡ããåãããªããããããŸããã ããããç§ã¯ããã°ã©ã æ€èšŒã·ã¹ãã ã«çŽæ¥æ¥ç¶ããŠãããããã®æçš¿ãèªåã®ã€ãã·ã¢ããã§æžããŠããŸãã
ããã§ã¯ããã€ã³ãã«è¡ããŸãããã
å瀟ã®å ¬åŒWebãµã€ãã«ãããšã PVS-Studio 6.0ã¯ã䜿ãããããšã³ãŒãèšè¿°æ®µéã§ã®ãšã©ãŒã®çºèŠã«çŠç¹ãåœãŠãéçã³ãŒãã¢ãã©ã€ã¶ãŒã§ãã
ãããŠæ¯èŒçæè¿ãå瀟ã¯CïŒãããžã§ã¯ãã®æ€èšŒããµããŒãããããŒãžã§ã³ããªãªãŒã¹ããŸããã å®éã«Microsoft Orleansãããžã§ã¯ãã確èªãããããã
ã¡ãªã¿ã«ãPVS-StudioããŒã ã¯ãæ€åºããããšã©ãŒã«ã€ããŠOrleansãããžã§ã¯ãããã§ãã¯ããŸããããå°ãå ã«é²ã¿ã絶ããå¿å°ãããŠãã³ãŒã³ã§KDPVïŒã泚æãåŒãããã®ç»åãïŒã芪åã«æäŸããŠãããŸããã

ãªã«ã¬ã¢ã³ãããžã§ã¯ããããŒãã£ã«ã¢ã¯ã¿ãŒãããã³ãã®å©çãšã¯äœã§ããã

Microsoft Orleansã¯ãä»®æ³ã¢ã¯ã¿ãŒã®æŠå¿µã«åºã¥ããŠæ§ç¯ããããã¬ãŒã ã¯ãŒã¯ã§ãã Orleansã®çšèªã¯ãä»ã®åæ§ã®ãã¬ãŒã ã¯ãŒã¯ïŒAkka.NetãService FabricãErlang ActorsïŒãšã¯å°ãç°ãªããŸããã¢ã¯ã¿ãŒã¯Grains ïŒå¥åç©ç©ïŒãšåŒã°ããã¯ã©ã¹ã¿ãŒã«åå ããŠãããµãŒããŒã¯SiloãšåŒã°ããŸãã
ä»®æ³ã¢ã¯ã¿ãŒã®å©ç¹ã¯ããã€ã§ãã³ãŒããOrleans Runtimeãããããã·ãååŸããŠããã®ã€ã³ã¿ãŒãã§ã€ã¹ãšIdãä»ããŠç¹å®ã®Grainã«ã¢ã¯ã»ã¹ã§ããããšã§ãã ãããã·ã¡ãœãããåŒã³åºããšãã¡ãã»ãŒãžã¯è€æ°ã®ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒã«éä¿¡ãããããã§ç¹å®ã®IDã§Grainã«é ä¿¡ãããŸãã ã©ã³ã¿ã€ã ã¯ããã®ãããªGrainãããããã®ãµãŒããŒäžã®åäžã®ã³ããŒã§äœæãããåŸç¶ã®åŒã³åºãããã®Grainã«é ä¿¡ãããããšãä¿èšŒããŸãã ãŸããã©ã³ã¿ã€ã ã¯ãäžå®æéã³ãŒã«ãåä¿¡ããªãã£ãã°ã¬ã€ã³ãèªåçã«åé€ïŒéã¢ã¯ãã£ãåïŒãããããã¬ããŒãžãåžžã«åéããŸãã ãã°ã¬ã€ã³ãã以åã«é 眮ãããŠãããµãŒããŒããªãã©ã€ã³ã«ãªã£ãå Žå-ã©ã³ã¿ã€ã ã¯ã€ã³ã¹ã¿ã³ã¹ãããã«å¥ã®ã€ã³ã¹ã¿ã³ã¹ã«äžããããããªé 延以å€ã¯äœãæ°ä»ããªãã§ãããã åŒã³åºããåããµãŒããŒã«å°éããå Žå-ã©ã³ã¿ã€ã ã¯ãããæé©åããåŒã³åºãã¯ããŒã«ã«ã«ãªããŸãã
å®éãä»®æ³ã¢ã¯ã¿ãŒã®å©çã¯ãã¯ã©ãŠãã§éåžžã«ç°¡åã«ã¹ã±ãŒãªã³ã°ã§ããããšã§ãã
ãµã€ãã¯ãäºãã«pingãå®è¡ãã誰ããã¢ã¯ã»ã¹ã§ããªããšããå€æãããåããåå¿ãã®ç²ãèªåèªèº«ãšãã¹ãŠã®éã§åé åžããŸãã ã¯ã©ã¹ã¿ãŒã¯ãã¢ã¯ãã£ããªãµã€ããå°ãªããšã1ã€ååšããæ°ããåå è ãæ¥ç¶ããããšãç¬èªã®ç¯å²ã®ãã°ã¬ã€ã³ããåãåããã¢ã¯ãã£ãã«ãªã¯ãšã¹ããåŠçãå§ããéããåç¶ããŠå©çšå¯èœã§ãã ãããŠã䜿ãæ £ããOOPã¢ãããŒãã䜿çšããŠã³ãŒããèšè¿°ããŸãã ãDistributed CïŒ/ãNETãã®ããã«ãªããŸãã
ã©ã³ã¿ã€ã èªäœããã¡ãœãããã°ã¬ã€ã³ã§å®è¡ããããšãã«ãä»ã®åŒã³åºããåãã°ã¬ã€ã³ã«å°éããªãããšãä¿èšŒããŸãã ã©ã³ã¿ã€ã ã¯ãã³ãŒãã®ã·ã³ã°ã«ã¹ã¬ããå®è¡ãä¿èšŒããŸããããã«ãããã¹ã¬ããã»ãŒãã§ãªãç¶æ³ã«ã€ããŠèããå¿ èŠããªããªããæçšãªããžãã¹ããžãã¯ã®äœæã«éäžã§ããŸãã
äžè¬ã«ã亀æå¯èœãªã¹ãã¬ãŒãžãããã€ããŒãã¡ãã»ãŒãžã³ã°ãpub-subãªã©ãã¯ã©ãŠãïŒãŸãã¯ãªã³ãã¬ãã¹ã®åæ£åïŒãã©ãããã©ãŒã åãã¢ããªã±ãŒã·ã§ã³ã®éçºã«åœ¹ç«ã€ãã®ãªã©ãä»ã«ãå€ãã®èå³æ·±ããã®ããããŸãã
ãããžã§ã¯ãã®è©³çŽ°ã«ã€ããŠã¯ã Microsoft Orleans @ GitHubãã芧ãã ããã Microsoft Orleansã¯ã倧èŠæš¡ãããžã§ã¯ãã§ãååã«ãã¹ããããŠããŸãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãHalo 4ããã³Halo 5ã²ãŒã ã®ããã¯ããŒãã§äœ¿çšããããã¹ãŠã®ã²ãŒã ã«é¢ããæ å ±ãçµ±èšã®éèšãªã©ãåéããŸãã
ãªã«ã¬ã¢ã³ããã§ãã¯ã¢ãŠããããçç±
ãŸããç§ãã¡èªèº«ãOrleansã䜿çšããŠDrawboardã§ã¯ã©ãŠããã©ãããã©ãŒã ãäœæããŠããŸãã䟿å©ã§ä¿¡é Œæ§ã®é«ããã¬ãŒã ã¯ãŒã¯ã«äŸåããããšæããŸãã
第äºã«ãOrleansã§å®ããããŠããæŠå¿µãšä¿èšŒã¯ããªãéèŠã§ãããã¯ã©ã¹ã¿ãŒæäœã®å質ã¯ãã®å®è£ ã«äŸåããŸãã
第äžã«ãCïŒã§PVS-Studioãè©ŠããŠã¿ãã®ã¯ãããããã£ã-補åããŒã ã¯C ++ãããžã§ã¯ãã®ãã§ãã¯ã«é¢ããåªããèšäºãæžããããæè¿ãŸã§CïŒã¯äœãšã泚æã奪ãããŠããã
æ€èšŒçµæ
Microsoft Orleansãããžã§ã¯ãã¯éåžžã«åçã«éçºãããŠãããçãããå ŽæãèŠã€ããã®ã«ã¯åœ¹ç«ã¡ãŸããã1åéãã®ãã§ãã¯ã¯æããã«ãé·æçã«ã¯å šäœçãªå質ã«åœ±é¿ããŸããã
ãããã£ãŠãããŒãžã®æç¹ã§ãPRïŒ1288
4/02/2016 2:43:26 PM, Commit hash: 7c1e35466fde08fcf1c2caf64fa304d25e60e045
PVS-StudioïŒããŒãžã§ã³6.01.15638.1ïŒãçºè¡ãããŸããïŒ
- 18é倧床ã®é«ãã¢ã©ãŒã
- 7äžé倧床ã®èŠå
- 58é倧床ã®äœãã¢ã©ãŒã
PVS-Studioã§ãã¹ããããä»ã®ãããžã§ã¯ãïŒè€éããã³ãŒãéãéçºè ã®èœåããã®ä»å€ãã®èŠå ïŒãšæ¯èŒã§ããªãããããããè¯ããæªãããèšãã®ã¯å°é£ã§ãã
ããããäžè¬çã«-ããã¯ææªã®çµæã®ããã«ã¯èŠããŸãããäžå¯©ãªå Žæã®æ°ã¯3æ¡ãŸãã¯4æ¡ã®æ°åã§è¡šçŸãããŠããŸãã-1æ¥ã§ãã¹ãŠã衚瀺ããã³åŠçã§ããŸãã
PVS-Studioãæ·±å»ãªåé¡ãæ€åºãããã©ããã確èªããŸãããã
ãããŠãŸã -ããã«ãã¡ã€ã³ã³ãŒãïŒã©ã³ã¿ã€ã ããã³ãµããŒããããžã§ã¯ãïŒãšãã¹ãå ã®ã³ãŒããšã®éã®ãšã©ãŒã®åé¢ã瀺ãè¡šããããŸãã
é倧床 | åèš | ã©ã³ã¿ã€ã | ãã¹ã |
---|---|---|---|
é«ã | 18 | 12 *
| 6 |
äž | 7 | 4 | 3 |
äœã | 58 | 13 | 45 |
*
-1ã€ã®æ¹æ³ã§Replaceãäžé©åã«äœ¿çšããå Žåã¯4ã€ã®èŠåãæªäœ¿çšã®ã³ãŒãã§ã¯3ã€ã®èŠåã åèšã§5ã«æ³šæãã䟡å€ããããŸãã
äž»ã«ã©ã³ã¿ã€ã ã®ãšã©ãŒã«ã€ããŠèª¬æããŸãã éåžžããã¹ããšã©ãŒã¯ããã»ã©é倧ã§ã¯ãããŸããã 圌ãã¯ãã¹ãŠãOKã§ãããšããå¹»æ³ãäœæã§ããŸãããå®éã«ã¯ãã¹ãŠãããã»ã©ãã©è²ã§ã¯ãããŸãã...
ãããžã§ã¯ãã§æ€åºãããé倧ãªèŠå
æãèå³æ·±ããã®ããå§ããŸããããéåžžã«æ·±å»ã§ããããšãå€æããŸããã ãããžã§ã¯ãéçºè ã¯ããã®ãã°ã«èµ·å ããåé¡ã«ãçŽé¢ããããšãå€æããŸãã
ïŒããã¯ããããžã§ã¯ãã®Gitterãã£ããã§èŠã€ãã£ãåé¡ã«é¢ãããã®ã§ãïŒïŒ
...æè¿IIRCãåœæãããSanitizeTablePropertyã®æ¥ãã¹ããã°ã
...æ¶æ¯ãæ©èœããããšã確èªããŸããã
PVS-Studioã¯æ¬¡ã®èŠåãçºè¡ããŸããã
V3010é¢æ° 'Replace'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã AzureStorageUtils.cs 278,279,280,281
ãããŠãæå®ãããã¢ãã¬ã¹ã«ã¯ïŒãã°ã¯ãã§ã«ä¿®æ£ãããŠããŸãïŒã¡ãœããããããŸãã
public static string SanitizeTableProperty(string key) { // Remove any characters that can't be used in Azure PartitionKey or RowKey values key.Replace('/', '_'); // Forward slash key.Replace('\\', '_'); // Backslash key.Replace('#', '_'); // Pound sign key.Replace('?', '_'); // Question mark if (key.Length >= 1024) throw new ArgumentException(string.Format("Key length {0} is too long to be an Azure table key. Key={1}", key.Length, key)); return key; }
ããªãã¯ãŒã«ãªãã°ããã ã®ããæ²¹ïŒ...ãããŠããã®ãã°ãç§ãã¡ã®ã³ãŒãã§æ°åã¯ããŒã«ããå¯èœæ§ãé«ããšããæŽå¯ããã£ãããšãã£ãŠæ¥ãŸãã....ïŒ ã
æåååã®ããŒãã©ã¡ãŒã¿ãã¡ãœããã«æž¡ãããŸãã .NETã®æå
key.Replace
ã¯äžå€ã§ããããã
key.Replace
ãäœåºŠåŒã³åºããŠãå€ã¯å€ãããŸããã
次ã®è¯ãçºèŠã¯
V3006ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã ãthrowãããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸããæ°ããInconsistentStateExceptionïŒFOOïŒãã¹ããŒããŸãã MemoryStorageGrain.cs 129
if (currentETag != null) { string error = string.Format("Etag mismatch during {0} for grain {1}: Expected = {2} Received = null", operation, grainStoreKey, currentETag.ToString()); logger.Warn(0, error); new InconsistentStateException(error); }
æ°ããäŸå€ã¯ã¹ããŒãããŸãããã¹ããŒãããŸããã ã€ãŸã èšé²æã«Etag = nullãéä¿¡ããããããæåã®ã¬ã³ãŒãã§ããå Žåããšã©ãŒã¯çºçããŸããã åãã¡ãœããã§å°ãäœããªããŸãããå¥ã®äŸå€ããŸã ã¹ããŒãããŸã-ã€ãŸã ããã«ã¯åé¡ããããŸããã
å¥ã®èŠåïŒ
V3005ãjsonSettingsãå€æ°ã¯ããèªäœã«å²ãåœãŠãããŸãã AzureTableStorage.cs 104
æ§æãèªã¿åããšããjsonSettingså€æ°ã®ã·ãªã¢ã«åèšå®ã¯2ååæåãããŸãã
if (useJsonFormat) { jsonSettings = jsonSettings = OrleansJsonSerializer.SerializerSettings; }
ããã»ã©é倧ãªåé¡ã§ã¯ãããŸããããç§ã«ãšã£ãŠã¯ãªãã¡ã¯ã¿ãªã³ã°ã®çµæã®ããã«èŠããŸã-ãéå»ã®äººçãã§ã¯ããããã®å€æ°ã®1ã€ã¯ããããå¥ã®æ¹æ³ã§åŒã³åºãããŸããã ãã®åŸãããã©ã«ãèšå®çšã®å¥ã®å€æ°ãåé€ãããå²ãåœãŠãæ®ããŸããã
以äžïŒãã®å Žåã¯èª€å ±ïŒïŒ
** V3022åŒ 'USE_DEBUG_CONTEXT_PARAMS && argumentsïŒ= Null && arguments.Length> 0'ã¯åžžã«falseã§ãã GrainReference.cs 480 ***
[NonSerialized] private const bool USE_DEBUG_CONTEXT_PARAMS = false; ... if (USE_DEBUG_CONTEXT_PARAMS && arguments != null && arguments.Length > 0) { ... }
ãããã°ãã©ã°ãã³ã³ãã€ã©ã¯ãã©ã³ãã®ifãæé©åããŸãã ããã»ã©éèŠã§ã¯ãããŸããããã³ã³ããã¹ãããäœãèµ·ãããã¯æããã§ãã ãã ãããã®ãããªå Žæã確èªããããšã¯äŸç¶ãšããŠéèŠã§ããéèŠã§å¿ èŠãªã³ãŒãããcæé©åããããªãããã«ããããã§ãã
ãã®èŠåã¯äœ¿çšé »åºŠã®äœãã³ãŒãã§èŠã€ãã£ãããããã®ã»ã¯ã·ã§ã³ã§ã¯ç¹å¥ãªåé¡ã¯çºçããŸããã§ãããã次ã®ããšãå¯èœã§ãã
V3025圢åŒãæ£ãããããŸããã ããã©ãŒããããé¢æ°ãåŒã³åºããšãã«ãç°ãªãæ°ã®ãã©ãŒãããé ç®ãäºæ³ãããŸãã äºæ³ïŒ3.çŸåšïŒ2. Program.cs 169,183
WriteStatus(string.Format("**Calling DeleteGrain({0}, {1}, {2})", silo, grainId)); WriteStatus(string.Format("**Calling LookupGrain({0}, {1}, {2})", silo, grainId));
ããã¯ããã»ã©é倧ãªééãã§ã¯ãªãããã«æãããããããŸããããŸãããã¬ãŒããŸããäœãã¯èšé²ãããŸããã ããããéããŸãã å®éãé£ã³åºããŸã-
FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
ãããŠã次ã®èŠåã¯ãã³ãŒãããžãã¯ã®å®éã®åé¡ã瀺ãããšãã§ããŸãã幞ããªããšã«ãããã¯ãã®ã³ã°ã®ã¿ã§ã-
V3033ãã®ãelseããã©ã³ãã¯ãåã®ãifãã¹ããŒãã¡ã³ãã«é©çšããå¿ èŠãããå¯èœæ§ããããŸãã Interner.cs 251
private void InternCacheCleanupTimerCallback(object state) { ... long numRemoved = numEntries - internCache.Count; if (numRemoved>0) if (logger.IsVerbose) logger.Verbose(ErrorCode.Runtime_Error_100296, "Removed {0} / {1} unused {2} entries in {3}", numRemoved, numEntries, internCacheName, clock.Elapsed); else if (logger.IsVerbose2) logger.Verbose2(ErrorCode.Runtime_Error_100296, "Removed {0} / {1} unused {2} entries in {3}", numRemoved, numEntries, internCacheName, clock.Elapsed); }
ããã¯ã¹ã¿ã€ã«çã«è€éãªã³ãŒãã§ã-圌ããäœããããã®ãã¯ããŸãæ確ã§ã¯ãããŸããã ãã¡ãããããªãã¯ãããç解ããããšãã§ããŸããããã®ã¹ã¿ã€ã«ã¯èªè ã®ç®ãç Žãã ãã§ãªããAppleããã®é©ãã®ãããªãããããçš®é¡ã®äžå¿«ãªãã°ã®æ©äŒãéããŸãã
Apple蚌ææžãã§ãã¯ã®ãã°ïŒ
ifïŒïŒerr = SSLHashSHA1.updateïŒïŒhashCtxãïŒserverRandomïŒïŒïŒ= 0ïŒ
gotoã倱æããŸãã
ifïŒïŒerr = SSLHashSHA1.updateïŒïŒhashCtxãïŒsignedParamsïŒïŒïŒ= 0ïŒ
gotoã倱æããŸãã
gotoã倱æããŸãã
ãã®ãããªãã®ã衚瀺ãããªãããã«ããããã«ãStyleCopããã³ãé©åãªã¹ã¿ã€ã«ãé©çšãããä»ã®å€ãã®æ¹æ³ããããŸãã ãŸãã䜿çšããã®ã«ã䟿å©ã§ãã
ãã®å ŽåãéèŠã§ã¯ãªãå¥ã®èŠåã¯ãåã«åé·ãªæ€èšŒã§ãã ãããããã§ãã¯ãèšç®äžãé«äŸ¡ãã§ããå Žå-ãããåãé€ã䟡å€ããããŸãã
V3053éå°ãªè¡šçŸã ãµãã¹ããªã³ã°ã/ bootstrapãããã³ã/ bootãã調ã¹ãŸãã ClientGenerator.cs 310
else if (arg.StartsWith("/bootstrap") || arg.StartsWith("/boot")){...}
ããã«é¢ããŠã泚ç®ã«å€ããé倧ãªãšã©ãŒã¯ãããå°ã
Medium
ãšå°ãå ã«
Low
ãªããŸãã
äžçšåºŠã®ãšã©ãŒãèŠã€ãããŸãã
æåã®äŸã¯èŠåã®äŸã§ãããåââé¡ã®ã·ã°ãã«ãŸãã¯ããªããŒã®æ©äŒã®ããããã§ãã
V3054æœåšçã«å®å šã§ãªãäºéãã§ãã¯ããã¯ã ãããåé¿ããã«ã¯ãæ®çºæ§å€æ°ãŸãã¯åæããªããã£ãã䜿çšããŸãã StreamImpl.cs 142ã144
ã³ãŒããµã³ãã«ã¯ãããã«ã«ãããããŠãããã³ã¡ã³ãã®ããã¡ã€ã³ã»ã¯ã·ã§ã³ã®ã¿ãæ®ã£ãŠããŸãã
private readonly object initLock; // need the lock since the same code runs in the provider on the ... internal IAsyncBatchObserver<T> GetProducerInterface() { ->> // not so anonical double-checked locking, effectively doing the same, if (producerInterface != null) return producerInterface; lock (initLock) { if (producerInterface != null) return producerInterface; if (provider == null) provider = GetStreamProvider(); producerInterface = provider.GetProducerInterface<T>(this); } return producerInterface; } internal IInternalAsyncObservable<T> GetConsumerInterface() { ->> // Canonical double-checked locking if (consumerInterface == null) { lock (initLock) { if (consumerInterface == null) { if (provider == null) provider = GetStreamProvider(); consumerInterface = provider.GetConsumerInterface<T>(this); } } } return consumerInterface; }
ããã§ã¯ã ããã«ãã§ãã¯ããã¯ãã¿ãŒã³ã䜿çšãã2ã€ã®äŸã瀺ããŸã ã .NETã®äžçã®ãã£ãã¯ããªã¹ ïŒJon SkeetãšãåŒã°ããŸã ïŒã®èšäºã CïŒã§ã®ã·ã³ã°ã«ãã³ãã¿ãŒã³ã®å®è£ ãã¯ãã·ã³ã°ã«ãã³ãå¿ èŠãªå Žåã«ããããšã¬ã¬ã³ãã§ä¿¡é Œæ§ã®é«ãå®è£ ãæäŸããŸãã
ç§ããããæžãããã£ãïŒ
ããããå人çã«ãã1ã€çåããããŸãïŒãã®èšäºã¯ãã¹ãŠã®èšäºãšäŸã§åžžã«static
ãªããžã§ã¯ãã®ããã¯ã䜿çšããä¿¡é Œã§ããçµæãä¿èšŒãããéstatic
ããã¯ã§äœ¿çšã§ãããã©ããã¯ããããŸãã...
ããããéçºè ãšè©±ãããŠã Joe Duffyã«ããvolatileã®Sayonaraã«ãããã®èšäºãèªãã åŸã ç§ãã¡ã®å Žåãããã¯ã·ã³ã°ã«ãã³ã§ã¯ãªããééçãã£ãŒã«ãã®äœ¿çšã¯èš±å¯ãããŠããŸãã ãããŠãæ®çºæ§ãªãã
äžè¬ã«ããã®ãšã©ãŒã調ã¹ãŠãã³ãŒãã®åé¡ãªã®ããç¹ã«PVS-Studioã®ãã®èšºæã®åé¡ãªã®ãããããããªããããªãèªåçšã®ãã¯ãŒã ã®çŒ¶ããçºèŠããŸããã
ããããããŒã«ããã®ãããªãã¿ãŒã³ãäžè¬çã«ãã£ããã§ãããšããäºå®ã¯ãç§èŠãçŽ æŽãããã§ãã ãããŠãå°æ¥çã«ã¯ãããæŽç·Žããããããè¯ãèŠåã衚瀺ãããããšãé¡ã£ãŠããŸãã
å¥ã®è¯ãäŸã«ç®ãåããŸãããã°ã¯äººã«ã¯éåžžã«ã²ã©ãæãããããŸãããã¢ãã©ã€ã¶ãŒã«ã¯ç°¡åã«æãããããŸãã
V3022åŒ 'n1 == 0 && n1ïŒ= 0'ã¯åžžã«falseã§ãã 笊å·ãªãã®åã®å€ã¯åžžã«> = 0ã§ããããããã||ã ããã§æŒç®åã䜿çšããå¿ èŠããããŸãã UniqueKey.cs 113
private static UniqueKey NewKey(ulong n0, ulong n1, Category category, long typeData, string keyExt) { // in the string representation of a key, we grab the least significant half of n1. // therefore, if n0 is non-zero and n1 is 0, then the string representation will always be // 0x0 and not useful for identification of the grain. if (n1 == 0 && n1 != 0) throw new ArgumentException("n0 cannot be zero unless n1 is non-zero.", "n0");
ããã§ã¯ãn0ïŒ= 0ããã§ãã¯ããå¿ èŠããããŸãããããã¯ããã®ã³ãŒããžã®ã³ã¡ã³ãã§èšè¿°ãããŠãããçŸåšã®å®è£ ã§ã¯ããã§ãã¯ã¯åžžã«falseã§ãã ç¹°ãè¿ããŸããããã®å Žåã¯è¯ãã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã圹ç«ã¡ãŸã-å€æ°ã
n0
ãš
n1
ãããšãã°
firstHalf
ãš
secondhHalf
å Žåããšã©ãŒã¯ããæçœã«ãªããŸãã æ¯èŒããïŒ
if (firstHalf == 0 && secondHalf != 0) vs if (secondHalf == 0 && secondHalf != 0)
2ã€ã®ç°ãªãæ¹æ³ã§åãã³ãŒãã«é¢ããèŠå-
V3013ãIncrementMetricãé¢æ°ã®æ¬äœããDecrementMetricãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ1079ãè¡1095ïŒã TraceLogger.cs 1079
Spaced Copy-Pasteãããã2ã€ã®æ¹æ³ã®éã«æ£ããå®è£ ããããŸã
æžå°ãã¡ããªãã¯ãåæžããŸãã
public override void IncrementMetric(string name, double value) { foreach (var tc in TelemetryConsumers.OfType<IMetricTelemetryConsumer>()) { ->> tc.IncrementMetric(name, value); } } ... public override void DecrementMetric(string name, double value) { foreach (var tc in TelemetryConsumers.OfType<IMetricTelemetryConsumer>()) { ->> tc.IncrementMetric(name, value); } }
åãã§ããããã¹ãã§ã¯ïŒ
V3013ãStartTimerãé¢æ°ã®æ¬äœããStopTimerãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ183ã188è¡ç®ïŒã TimerOrleansTest.cs 183
public Task StartTimer(string timerName) { if (persistant) return persistantGrain.StartTimer(timerName); else return grain.StartTimer(timerName); } public Task StopTimer(string timerName) { if (persistant) return persistantGrain.StartTimer(timerName); else return grain.StartTimer(timerName); }
ãã¹ãã§ã®Ctrl + CãCtrl + Vããã®ãã®æšæ¶ã¯ãããæªãçµæãããããå¯èœæ§ããããŸã-ãã¹ãã¯åœéœæ§ã«ãªããŸãã
ãã¹ãã®è€éãªã³ãŒãã¯ã10åãŸãã¯100åã®éå§ã«å¯ŸããŠ1ã€ã®ãšã©ãŒãçæããå¯èœæ§ãããããã®ãããªãã¹ããåºæ¿ãåŒãèµ·ãããŸãã
V3032ãã®åŒã§åŸ æ©ããããšã¯ãã³ã³ãã€ã©ãŒãããã€ãã®å€æ°ãæé©åããå¯èœæ§ããããããä¿¡é Œã§ããŸããã ãããåé¿ããã«ã¯ãæ®çºæ§å€æ°ãŸãã¯åæããªããã£ãã䜿çšããŸãã LoggerTest.cs 468
// Wait until the BulkMessageInterval time interval expires before wring the final log message - should cause bulk message flush while (stopwatch.Elapsed <= TraceLogger.BulkMessageInterval) { Thread.Sleep(10); }
æ£çŽãªãšãããç§èªèº«ã¯ãã®ãµã€ã¯ã«ãç¡éã®ãµã€ã¯ã«ã«å€ããæ¹æ³ãšçç±ãæ¬åœã«ç解ããŠããŸããããPVS-Studio Webãµã€ãã®ãã®èŠåã®èª¬æã®äŸã¯ãããç解ããããV3032ã§ãã
ããã»ã©å€§ããªåé¡ã§ã¯ãªã ãã¹ãå ã®ã³ãŒãã§ãããçè«çã«ã-ã©ã³ãã ã«èœäžãããã¹ããæä¹ çãªåçµ-ã¯ãæã楜ãããã®ã§ã¯ãããŸããã
ãããŠåã³ãã¹ãã®å¥åŠãªã³ãŒã-
V3051éå°ãªã¿ã€ããã§ãã¯ã ãªããžã§ã¯ãã¯ãã§ã«ãäŸå€ãã¿ã€ãã§ãã PersistenceGrainTests.cs 178
catch (AggregateException ae) { exceptionThrown = true; Exception e = ae.GetBaseException(); ->> if (e is Exception) { // Expected error } else { throw e; } }
ã³ãŒãã
else
ãã©ã³ãã«å ¥ãããšã¯ãªããããäŸå€ãåã³ã¹ããŒãããããšã¯ãããŸããã éèŠåºŠã¯ã³ã³ããã¹ãã«äŸåããŸãããã¹ãã§ã¯ããã»ã©æããªããããããŸããããå¥ã®ã³ãŒãã§ã¯çŽç²ãªãã°ã§ã
é倧床ãäœããšã©ãŒ
PVS-Studioã¯ãã¹ãã§ããªãã®æ°ã®ã³ã¡ã³ããèŠã€ããŸãããããããã®ã»ãšãã©ã調ã¹ãåŸããããã®éã«é倧ãªãŸãã¯åœ±é¿ã®å€§ããåé¡ã¯ãªããšçµè«ä»ããããšãã§ããŸãã ãã®ãããªè£œåãå æ¬çã«ãã¹ãããããšã¯éåžžã«é£ãããå€ãã®å Žåãã·ã¹ãã ã®ç¹å®ã®åäœãåŒãèµ·ããããã«ããŸããŸãªããªãã¯ãå®è¡ããå¿ èŠããããŸãã
ããšãã°ãããã«ïŒ
V3008ãpromiseãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ91ã84ãTestInternalGrains ErrorGrain.cs 91
// the grain method returns OK, but leaves some unobserved promise -->>Task<long> promise = Task<long>.Factory.StartNew(() => { if (!doThrow) return 0; logger.Info("About to throw 1."); throw new ArgumentException("ErrorGrain left Immideate Unobserved Error 1."); }); -->>promise = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); return Task.FromResult(11);
GCã«ãã£ãŠã³ã³ãã€ã«ãããã¿ã¹ã¯ã§ã®ã³ãŒãã®åäœã確èªãããŸãã
ä»ã®ããšã«æ³šæããå¿ èŠããããã®ïŒãããã®ãšã©ãŒã¯ããã¹ãäžã«èª€ã£ãæåŸ ã«ã€ãªããå¯èœæ§ããããŸãïŒïŒ
V3013ãProduceSequentialSeriesãé¢æ°ã®æ¬äœããProduceParallelSeriesãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ618ã625è¡ç®ïŒã StreamingGrain.cs 618
public override async Task ProduceSequentialSeries(int count) { await base.ProduceParallelSeries(count); State.Producers = _producers; await WriteStateAsync(); } public override async Task ProduceParallelSeries(int count) { await base.ProduceParallelSeries(count); State.Producers = _producers; await WriteStateAsync(); }
ãã¹ãçšã®ç¹å¥ãªã¯ã©ã¹ã§ã¯ãé£ç¶ããäžé£ã®ã€ãã³ããçæããããã«èšèšãããã¡ãœãããåžžã«äžŠåã€ãã³ããçæããŸãã ããããããã§åé¡ãããŸãããããã¹ãå ã®ã»ãã³ãã£ã¯ã¹ã¯èª€è§£ãæããŸãã
V3013ãTestInitializeãé¢æ°ã®æ¬äœããTestCleanupãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ44ã52è¡ç®ïŒã ConfigTests.cs 44
[TestInitialize] public void TestInitialize() { TraceLogger.UnInitialize(); GrainClient.Uninitialize(); GrainClient.TestOnlyNoConnect = false; } [TestCleanup] public void TestCleanup() { TraceLogger.UnInitialize(); GrainClient.Uninitialize(); GrainClient.TestOnlyNoConnect = false; }
æ§æãã¹ãã§ã¯ãåæåäžããã³å®äºæã«ãäœããã®çç±ã§ãããªããã£ãã®DEéå§ã2åå®è¡ãããŸãã
V3043ã³ãŒãã®æäœããžãã¯ããã®ãã©ãŒãããã«å¯Ÿå¿ããŠããŸããã ã¹ããŒãã¡ã³ãã¯å³åŽã«ã€ã³ãã³ããããŸãããåžžã«å®è¡ãããŸãã äžæ¬åŒ§ãæ¬ èœããŠããå¯èœæ§ããããŸãã RequestContextTest.cs 87.97,111,155,181
if(msg.RequestContextData != null) foreach (var kvp in msg.RequestContextData) { headers.Add(kvp.Key, kvp.Value); };
ããã§ããç§ã¯å³æ Œãªã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã®ã«ãŒã«ã®å€§ããªæ¯æè ã§ãã ãŸããå°ãªããšãStyleCopãResharperãCodeFormatterã«ãã£ãŠèªåçã«ã¹ã¿ã€ã«ã匷å¶ããŸãã è²»çšã¯ããããŸããããç®ãã€ã¶ããªãããã«ã§ããŸãã
V3052å ã®äŸå€ãªããžã§ã¯ããaeãã飲ã¿èŸŒãŸããŸããã å ã®äŸå€ã®ã¹ã¿ãã¯ã倱ãããå¯èœæ§ããããŸãã GrainReferenceCastTests.cs 212
catch (AggregateException ae) { Exception ex = ae.InnerException; while (ex is AggregateException) ex = ex.InnerException; throw ex; }
ã¹ã¿ãã¯AggregatedExceptionã倱ãããŸãã ä»ã®äŸå€ãããå Žåã¯ãããæªãããšãç解ããŠããŸããããã®ãããžã§ã¯ãã§ã¯ãåãæ¹æ³ã§AggregatedExceptionããå·»ãæ»ãããŸãã AggregatedExceptionãcatchã»ã¯ã·ã§ã³ã«ããå Žåããããåœéœæ§ã§èšè¿°ããŸãã
ãããžã§ã¯ãéçºè ã«ããçºèŠããããã°ã®éèŠåºŠè©äŸ¡ã
éä¿¡ããããã¹ãŠã®ãšã©ãŒã¬ããŒãã®ãã¡ã3æéåŸã«5ããã°ãšããŠããŒã¯ããã1ã¯ã¯ãªãã£ã«ã«ã§
Replace
ä¿®æ£ãããŸããã èªåã¢ãŒãã§20åéã®éç解æãè¡ããšãããªãè¯ãçµæãåŸãããŸãã
ã³ãŒãåââæãä»æã®å¥ã®ãæ°ã«å ¥ãã§ã¯ãªãçç±ã
Orleansãããžã§ã¯ãã¯éåžžã«éäžçã«éçºãããŠãããã³ãããã®é »åºŠã¯éåžžã«é«ããšGihubã¯ç¢ºèªããŠããŸã-Orleans -contributors ã èšäºã®å·çäžã«ãåæãã°ãä¿æããªããããããžã§ã¯ããæ°åãã§ãã¯ããŸããã PVS Studioã®ç°ãªãããŒãžã§ã³ïŒ6.0ããã³6.01ïŒãå«ãã
ããŸããŸãªãã°ã®æ¯èŒã次ã«ç€ºããŸãã
åªå é äœ | 1æ28æ¥ | 2æ2æ¥ | 2æ4æ¥ãv6.01 | ã³ã¡ã³ã |
---|---|---|---|---|
é«ã | 19 | 21 | 18 | 2æ¥ã§-3é倧ãªãšã©ãŒ-ããã¯è¯ãã§ãã ããããããšãã°ããã®ãã¡ã®2ã€ã¯äžèšã®V3025ã®é¡äŒŒç©ã§ããã ãã®ãããªã³ãŒãããã§ãã¯ããããšããã§ããŸããã§ããã |
äž | 4 | 4 | 7 | åã2æ¥éã§ãäžçšåºŠã®é倧床ã®3ã€ã®èŠåã |
äœã | 52 | 46 | 58 | +12ã®æ°ããããããªã³ãŒãã»ã¯ã·ã§ã³ã |
è¡šãããããããã«ãé倧ãªãšã©ãŒã¯éåžžã«çãæéã§çŸãããæ¶ãããããŸãã æ°æéã®ãããã°ãçç£ã®èœã¡èŸŒã¿ã®åŸã§ã¯ãªãããã«ãçŽåŸã«åæã®çµæãšããŠãããããã£ããããæ¹ã䟿å©ãªå Žåãããã°ã©ããŒã®æéãšç¥çµãç¯çŽããŸãã ãã¡ããã ããã¯ã貧ä¹äººãç æ°ãããéæã¡ã§å¥åº·ãªæ¹ãè¯ããã·ãªãŒãºã®ãããªãã£ãŒã§ãããå°ãªããšãäžéšã®å©çšå¯èœãªéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããªãããã°ã©ããŒãããå Žå-ãããªãã¯ééã£ãŠããŸãã...
䜿ããããã®èŠ³ç¹ãã-PVS-StudioãšVisual Studio 2015ã®çµ±åã¯éåžžã«ç°¡åã§ã-CïŒãã¡ã€ã«ããããžã§ã¯ãããŸãã¯ã«ãŒããœãªã¥ãŒã·ã§ã³ã®ãœãªã¥ãŒã·ã§ã³ãšã¯ã¹ãããŒã©ãŒã®ã³ã³ããã¹ãã¡ãã¥ãŒã«ã¯ã
Analyze with PVS-Studio
ã¢ã€ãã ãç·è²ã®ã¢ã€ã³ã³ã§ã¯ã£ãããšè¡šç€ºãããŸãã èŠã€ããã®ã¯ãšãŠãç°¡åã§ãã ãã®ã³ã³ããã¹ãã¡ãã¥ãŒã«ã®ã¿ãä»ã®æ¡åŒµæ©èœãã100500ãã€ã³ãããªãå Žåã Package Manger ConsoleãŸãã¯build.cmdãéããŠ
PVS-Solution
ãŸãã¯
PVS-Project Orleans
ãšèšãããšãã§ããããã«ãã³ãã³ãã©ã€ã³ããç°¡åã«åæãå®è¡ã§ããè£å©çãªNugetããã±ãŒãžãèŠãã®ã¯èå³æ·±ãã§ããããæ°ããCoreCLRã®xprojã¡ã«ããºã ã«çµã¿èŸŒãŸãããã®ã
ãã ãã
Ctrl+Q, PVS ... Down, Down, Down, Down, Enter
:)ã¯ã¯ã€ãã¯ã¹ã¿ãŒãã«ã¯ååã§ãã
ãããã«
çŸä»£ã®éçºã®çŸå®ã¯ãéçºã®é床ã«éåžžã«é«ãæ°Žæºãèšå®ããŠããŸã-å°ãªããšãæ¥çã®ç«¶åä»ç€Ÿã®ã¬ãã«ã«ãšã©ãŸãããã«ã誰ããéåžžã«è¿ éã«åé²ããããšããŠããŸãã åœç¶ã®ããšãªããããã®ãããªéçºã®ã¹ããŒãã§ã¯ãäœããèŠéããããäžæ³šæã«æžãããšãã§ããŸãã ãã¹ãã®åºç¯ãªã»ããã¯ãåé¡é åãšååž°ã®ç¹å®ã«åœ¹ç«ã¡ãŸãããããã¯äžèœè¬ã§ããããŸãã-ãã¹ãã«ãšã©ãŒãããããã®ãããªã»ãããäœæãããããææ°ã«ä¿ã€ã«ã¯ãæéãšåŽåãããããŸãã
Visual Studioã®èŠåãResharperã®ã¢ãã©ã€ã¶ãŒãPVS-Studioã®ãããã®çµ±èšã¢ãã©ã€ã¶ãŒããéçºè ã³ã¬ã¯ã·ã§ã³ã®å¥ã®ããŒã«ã§ãããã³ãŒãã®æœåšçãªåé¡ãæ€åºããããã®ã¢ã·ã¹ã¿ã³ãã§ãã å°ãªããšãç¡æã§å ¥æã§ãããã®ã䜿çšããŠãã ããã ããšãã°ããã¹ãŠã®ãããžã§ã¯ãã§ãèŠåããšã©ãŒãšããŠæ±ãã¯ããã©ã«ãã§ãªã³ã«ãªã£ãŠããŸããããã«ãããå°ãèŠåŸã®ããã³ãŒããæžãããšãã§ããŸãã ããã¯ããã°ã©ãã«äœã®è²»çšãããããŸãããã圌ãèªåã®è¶³ã§æã€ã®ãé²ãããšãã§ããŸãã ææ°ã®ã¢ãã©ã€ã¶ãŒã䜿çšããã®ã¯éåžžã«ç°¡åã§ããã»ãšãã©ã®å Žåããã¹ãŠãããã®ãŸãŸãæ£åžžã«åäœããå°ãªããšãäœããã®åœ¢ã§ã¢ãã©ã€ã¶ãŒã®äžäœ¿çšãæ£åœåã§ããå¯äžã®ããšã¯äŸ¡æ Œã®åé¡ã§ãã
NBïŒ èè ã¯ããã¹ãçšã®äžæã©ã€ã»ã³ã¹ãæäŸããŠãããPVS-StudioããŒã ã«æè¬ããŸãã
èªãäººå šå¡-幞ãã§ãã°ã®ãªãããã°ã©ãã³ã°ïŒ