ã¯ããã«
FlashDevelopã¯ãAction ScriptããŒãžã§ã³2ããã³3ãHaxeãJavaScriptãHTMLãPHPãCïŒããµããŒããã人æ°ã®ããFlashã¢ããªã±ãŒã·ã§ã³éçºç°å¢ã§ãããã³ãŒãè£å®ãsvnãgitãmercurialããã³ãã¬ãŒãã®çµã¿èŸŒã¿ãµããŒããªã©ãææ°ã®ã³ãŒããšãã£ã¿ãŒã«åºæã®æ©èœãåããŠããŸãããµãŒãããŒãã£ã®ãã©ã°ã€ã³ãæ§æ匷調ããŒããªã©ã ç¹ã«ãFlashDevelopã¯Fireaxis Gamesã䜿çšããŠXCOMïŒEnemy UnknownãéçºããŸããã
æ€èšŒçµæ
FlashDevelopã¯ãªãŒãã³ãœãŒã¹è£œåã§ãããCïŒã§èšè¿°ãããŠããããšãèæ ®ããŠãã¢ãã©ã€ã¶ãŒã§ãã¹ãããããšèããŸããã åæã«ã¯ãPVS-Studio v6.05éçã¢ãã©ã€ã¶ãŒã䜿çšããŸããã ãã®èšäºã®ãã¬ãŒã ã¯ãŒã¯å ã§èŠã€ãã£ããã¹ãŠã®åé¡é åãåæããããšã¯ã§ããªããããæãèå³æ·±ãã¢ãã©ã€ã¶ãŒã¡ãã»ãŒãžãæ€èšããŸãã
æªäœ¿çšã®ã¡ãœããã®æ»ãå€
ãåç¥ã®ããã«ãCïŒã®æååã¯äžå€ãªããžã§ã¯ãã§ãããæååãå€æŽããã¡ãœããã¯ãå ã®æååãå€æŽããã«ãå®éã«Stringåã®æ°ãããªããžã§ã¯ããè¿ããŸãã ãã ããå®è·µã瀺ãããã«ãéçºè ã¯ãã®æ©èœãå¿ããŠããŸãã ããšãã°ãã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®ãšã©ãŒãæ€åºããŸããã
V3010é¢æ°ãInsertãã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã ASPrettyPrinter.cs 1263
public void emit(IToken tok) { .... lineData.Insert(0, mSourceData.Substring(prevLineEnd, ((CommonToken)t).StartIndex - prevLineEnd)); .... }
V3010é¢æ°ãInsertãã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã MXMLPrettyPrinter.cs 383
private void prettyPrint(....) { .... while (aToken.Line == currentLine) { lineData.Insert(0, aToken.Text); .... } .... }
ãããããéçºè ã¯ãã®èšèšã念é ã«çœ®ããŠããŸããã
lineData = lineData.Insert(....);
V3010蚺æããªã¬ãŒã®å¥ã®äŸïŒ
V3010é¢æ° 'NextDouble'ã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã ASFileParser.cs 196
private static string getRandomStringRepl() { random.NextDouble(); return "StringRepl" + random.Next(0xFFFFFFF); }
ãã®ã³ãŒãã«ã¯æ©èœã®èŠ³ç¹ããã®ãšã©ãŒã¯å«ãŸããŠããŸãããã random.NextDoubleïŒïŒã®åŒã³åºãã«ã¯æå³çãªè² è·ã¯ãªããåé€ã§ããŸãã
åãã£ã¹ãåŸã®NULLãã§ãã¯
å ã®åãç®çã®åã«ãã£ã¹ãã§ããªãå Žåã«ãçµæã®å€ã®nullã確èªããããšã¯ãåå€ææäœã®åŸã®æšæºçãªæ¹æ³ã§ãã ãã®ãããªæ¥åžžçãªæäœãå®è¡ããå Žåãéçºè ã¯äžæ³šæã§ãééã£ãå€æ°ããã§ãã¯ããå¯èœæ§ããããŸãã åœç€Ÿã®ã¢ãã©ã€ã¶ãŒã¯é£œããããã®ãããªããšã泚ææ·±ãç£èŠããŸãã
V3019 ãasãããŒã¯ãŒãã䜿çšããåå€æåŸã«ã誀ã£ãå€æ°ãnullãšæ¯èŒãããå¯èœæ§ããããŸãã å€æ°ãitemãããvalãã確èªããŠãã ããã WizardHelper.cs 67
public static void SetControlValue(....) { .... string val = item as string; if (item == null) continue; .... }
æããã«ããã®äŸã§ã¯ã itemã§ã¯ãªãnullå€æ°ããã§ãã¯ããå¿ èŠããããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
string val = item as string; if (val == null) continue;
ã¡ãœããæ¬äœã®è€è£œ
åäžã®ããã£ãæã€ã¡ãœãããã³ãŒãå ã§èŠã€ãã£ãå Žåãããã¯åžžã«ç念ãåŒãèµ·ãããŸãã æè¯ã®å Žåããã®ãããªã³ãŒãã¯ãªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠãšããææªã®å Žåãæ©æ¢°çãªã³ããŒïŒããŒã¹ãã¯ããã°ã©ã ã®ããžãã¯ãæªããŸãã æ ¹æ ããªãããã«ããããã«ã次ã®äŸãæ€èšããŠãã ããã
V3013 ãSuspendMdiClientLayoutãé¢æ°ã®æ¬äœããPerformMdiClientLayoutãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ377ãè¡389ïŒã DockPanel.MdiClientController.cs 377
private void SuspendMdiClientLayout() { if (GetMdiClientController().MdiClient != null) GetMdiClientController().MdiClient.PerformLayout(); //<= } private void PerformMdiClientLayout() { if (GetMdiClientController().MdiClient != null) GetMdiClientController().MdiClient.PerformLayout(); }
ã芧ã®ãšãã ã SuspendMdiClientLayoutã¡ãœãããšPerformMdiClientLayoutã¡ãœããã®æ¬äœã¯ãŸã£ããåãã§ãã ããã¯ããããã³ãŒãã®ã³ããŒãåå ã§ããã SuspendMdiClientLayoutã¡ãœããã®ååã¯ãã¬ã€ã¢ãŠããäžæåæ¢ããããšãåæãšããŠããŸããã代ããã«ã¬ã€ã¢ãŠããåæç»ãããŸãïŒ MdiClient.PerformLayoutïŒïŒ ã ãã®ã¡ãœããã®æ£ããå®è£ ã¯æ¬¡ã®ããã«ãªã£ãŠãããšæããŸãã
private void SuspendMdiClientLayout() { if (GetMdiClientController().MdiClient != null) GetMdiClientController().MdiClient.SuspendLayout(); //<= }
å¥ã®äŸã ãã®ãããžã§ã¯ãã¯ãäœãã®åå¥è§£æã®ããã«èšèšãããLexerã¿ã€ããå®è£ ããŸãã ãã®ã¿ã€ãã¯ã ãã©ã€ããŒãã¹ã¿ãã£ãã¯ããŒã«StateXXïŒFsmContext ctxïŒã®åœ¢åŒã®ã·ã°ããã£ãæã€åãã¿ã€ãã®ã¡ãœããã28åå®è£ ããŸããXXã¯1ã28ã®ç¯å²ã«ãããŸãããšã©ãŒã³ãŒãå ã§ãPVS-Studioã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®ããã«åå¿ããŸãã
V3013 ãState11ãé¢æ°ã®æ¬äœããState15ãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãïŒ532ã589è¡ç®ïŒã Lexer.cs 532
private static bool State11 (FsmContext ctx) { ctx.L.GetChar (); switch (ctx.L.input_char) { case 'e': ctx.Return = true; ctx.NextState = 1; return true; default: return false; } } private static bool State15 (FsmContext ctx) { ctx.L.GetChar (); switch (ctx.L.input_char) { case 'e': ctx.Return = true; ctx.NextState = 1; return true; default: return false; } }
2ã€ã®æ¹æ³ãåãç¶æ³ãåŠçãããšããäºå®ã¯éåžžã«çãããããã§ãã ãã®åé¡ãä¿®æ£ããæ¹æ³ã¯æ確ã§ã¯ãããŸãã;äœæ¥ã®è«çã¯èè ã®ã¿ãç¥ã£ãŠããŸãã ãŸãã倧éã®å調ãªã³ãŒããèªãã®ã¯æžããããã¯ããã«é£ããã®ã§ããã®åé¡ã¯ã³ãŒãã¬ãã¥ãŒäžã«ç°¡åã«æ€åºã§ããããšãéåžžã«çããŸãã äžæ¹ãéçã¢ãã©ã€ã¶ãŒã¯ããã§éåžžã«åœ¹ç«ã¡ãŸãã
ãµã€ã¯ã«ããã®ç¡æ¡ä»¶ã®çµäº
ããã«åæãããšããã®ãããªèå³æ·±ãç¹ãæããã«ãªããŸããã
V3020ã«ãŒãå ã®ç¡æ¡ä»¶ã®ããã¬ãŒã¯ãã AirWizard.cs 1760
private void ExtensionBrowseButton_Click(....) { .... foreach (var existingExtension in _extensions) { if (existingExtension.ExtensionId == extensionId) extension = existingExtension; break; } .... }
éçºè ã_extensionsã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãå®è¡ãã察å¿ããextensionIdãæã€æåã®existingExtensionãªããžã§ã¯ããèŠã€ããŠãã«ãŒããçµäºããããšãææ¡ããããšæããŸãã ããããæ¬åŒ§ã®ç¯çŽã«ããããµã€ã¯ã«ã¯æåã®å埩åŸã«ç¢ºå®ã«çµäºããããã°ã©ã ã®ããžãã¯ã«å€§ããªåœ±é¿ãäžããŸãã
åŒã¯åžžã«true / falseã§ã
å¥ã®äžè¬çãªãšã©ãŒã®åå ã¯æ¡ä»¶åŒã§ãã åŒã«å€æ°ã®å€æ°ãå¢çå€ãããªãè€éãªåå²ãå«ãŸããŠããå Žåããšã©ãŒãçºçããå¯èœæ§ãé«ããªããŸãã ããšãã°ã次ã®ãããªæ¡ä»¶æŒç®åãèããŠã¿ãŸãããã
private void SettingChanged(string setting) { if (setting == "ExcludedFileTypes" || setting == "ExcludedDirectories" || setting == "ShowProjectClasspaths" || setting == "ShowGlobalClasspaths" || setting == "GlobalClasspath") { Tree.RebuildTree(); } else if (setting == "ExecutableFileTypes") { FileInspector.ExecutableFileTypes = Settings.ExecutableFileTypes; } else if (setting == "GlobalClasspath") //<= { // clear compile cache for all projects FlexCompilerShell.Cleanup(); } }
PVS-Studioéçã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®ãšã©ãŒãå ±åããŸãã
V3022åŒ 'setting == "GlobalClasspath"'ã¯åžžã«falseã§ãã PluginMain.cs 1194
å®éã else ifæ¡ä»¶ïŒèšå®==â GlobalClasspathâïŒã¯ãæåã®ifã«åãæ¡ä»¶ãååšããããã決ããŠæºããããããšã¯ãããŸããã ãã ããäžéšã®ããžãã¯ã®å®çŸã¯ããã®æ¡ä»¶ã®å®çŸã«äŸåããŸãã ãã®ã¡ãœããã®èªã¿ããããç°¡çŽ åããããã«ã switchã¹ããŒãã¡ã³ãã䜿çšããŠæžãæããŸãã
äžå¯èœãªç¶æ ã®æ¬¡ã®äŸïŒ
V3022åŒ 'high == 0xBF'ã¯åžžã«falseã§ãã JapaneseContextAnalyser.cs 293
protected override int GetOrder(byte[] buf, int offset, out int charLen) { byte high = buf[offset]; //find out current char's byte length if (high == 0x8E || high >= 0xA1 && high <= 0xFE) charLen = 2; else if (high == 0xBF) charLen = 3; .... }
ã¢ãã©ã€ã¶ãŒã¯ãåŒ'high == 0xBF'ãåžžã«falseã§ããããšã瀺ããŸãã ããã¯ãå€0xBFãhigh> = 0xA1 && high <= 0xFEã®ç¯å²ã«è©²åœããæåã®ifã§ãã§ãã¯ãããããã§ã ã
V3022蚺æããã®ã¡ãã»ãŒãžã®å¥ã®äŸïŒ
V3022åŒ 'ïŒOutline.FlagTestDrop'ã¯åžžã«trueã§ãã DockPanel.DockDragHandler.cs 769
private void TestDrop() { Outline.FlagTestDrop = false; .... if (!Outline.FlagTestDrop) { .... } .... }
ãã®ã¹ããããã§ã¯ãfalseã«èšå®ãããã³ãŒãå ã§ãã以äžå€æŽãããªãOutline.FlagTestDropãã£ãŒã«ããifæ¡ä»¶ã¹ããŒãã¡ã³ãã§äœ¿çšãããŠããããšãããããŸãã ããããããã®ã¡ãœããã§ã¯ãéçºè ãifïŒïŒOutline.FlagTestDropïŒcheckãå®è£ ããããããã®ãã£ãŒã«ãã®å€ãå€æŽããæ©èœã¯å®è£ ãããŠããŸããã
nullããã§ãã¯ãããåã«ã€ã³ã¹ã¿ã³ã¹ã䜿çšãã
å®éã«ã¯ãããšãã°ãåãã£ã¹ããã³ã¬ã¯ã·ã§ã³ããã®èŠçŽ ã®éžæãªã©ã®åŸãnullã®å€æ°ããã§ãã¯ããå¿ èŠãåžžã«çºçããŸãã ãã®ãããªç¶æ³ã§ã¯ãçµæã®å€æ°ãnullã§ãªãããšã確èªããŠãããããã䜿çšããŸãã ãã ããç§ãã¡ã®å®è·µã瀺ãããã«ãéçºè ã¯çµæã®ãªããžã§ã¯ããããã«äœ¿çšãå§ãããããnullã§ãªãããšã確èªããã ãã§ãã ãããã®ãšã©ãŒã¯ãV3095蚺æã«ãã£ãŠå ±åãããŸãã
V3095 ãnodeããªããžã§ã¯ãã¯ãnullã«å¯ŸããŠæ€èšŒãããåã«äœ¿çšãããŸããã ãã§ãã¯è¡ïŒ364ã365ãProjectContextMenu.cs 364
private void AddFolderItems(MergableMenu menu, string path) { .... DirectoryNode node = projectTree.SelectedNode as DirectoryNode; if (node.InsideClasspath == node) menu.Add(RemoveSourcePath, 2, true); else if (node != null && ....) { menu.Add(AddSourcePath, 2, false); } .... }
ãã®äŸã§ã¯ã projectTree.SelectedNodeãã£ãŒã«ãã®ã¿ã€ãã¯GenericNodeã§ãããããã¯DirectoryNodeã®åºæ¬ã¿ã€ãã§ãã åºæ¬åãªããžã§ã¯ãã®æŽŸçåãžã®ãã£ã¹ãã倱æãããã®çµæãããŒãå€æ°ã«ç©ºã®åç §ãå«ãŸããå ŽåããããŸãã ãã ããã芧ã®ãšãã ãåå€ææäœã®åŸãéçºè ã¯ããã«node.InsideClasspathãã£ãŒã«ãã«ã¢ã¯ã»ã¹ãã ããŒãå€æ°ã®nullã®ã¿ããã§ãã¯ããŸãã ãã®ãããªå®è£ ã§ã¯ãNullReferenceExceptionãçºçããå ŽåããããŸãã
æž¡ãããåŒæ°ã®å€ãäžæžãããŸã
ã¢ãã©ã€ã¶ãŒã¯ããã®ãããªæœåšçã«åé¡ã®ããã³ãŒãå ã®å Žæãæ€åºããŸããã
V3061ãã©ã¡ãŒã¿ãŒ 'b'ã¯ã䜿çšãããåã«åžžã«ã¡ãœããæ¬äœã§æžãæããããŸãã InBuffer.cs 56
public bool ReadByte(byte b) // check it { if (m_Pos >= m_Limit) if (!ReadBlock()) return false; b = m_Buffer[m_Pos++]; //<= return true; }
ãã®ã¡ãœããã«æž¡ãããåŒæ°bã®å€ã¯äœ¿çšãããªããããäžæžããããããã§ã䜿çšãããŸããã ãã®ã¡ãœããã¯æå³ãããšããã«å®è£ ãããŠããªããšæ³å®ã§ããŸãïŒã³ã¡ã³ãã // check it ããããã瀺åããŠããŸãïŒã ããããããã®ã¡ãœããã®ã·ã°ããã£ã¯æ¬¡ã®ããã«ãªããŸãã
public bool ReadByte(ref byte b) { .... }
ã¡ãœããã«æž¡ãããåŒæ°ã®é åºãæ£ãããããŸãã
ã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºããã次ã®çãããå Žæã¯ãã³ãŒãã¬ãã¥ãŒãå®æœããéã«ç°¡åã«æ°ä»ãããšãã§ããŸããã
V3066 ã_channelMixer_OVERLAYãã¡ãœããã«æž¡ãããåŒæ°ã®èª€ã£ãé åºã®å¯èœæ§ïŒãbackãããã³ãforeãã BBCodeStyle.cs 302
private static float _channelMixer_HARDLIGHT(float back, float fore) { return _channelMixer_OVERLAY(fore, back); }
_channelMixer_OVERLAYã¡ãœããã«ã¯æ¬¡ã®ã·ã°ããã£ããããŸãã
static float _channelMixer_OVERLAY(float back, float fore)
ãããããããã¯ãŸãã«æå³ãããã®ã§ãã ãã ãããã®ã¡ãœãããåç §ãããšãã«ã foreåŒæ°ãšbackåŒæ°ãéã«ãªã£ãŠããå¯èœæ§ããããŸãã ãããŠãã¢ãã©ã€ã¶ã¯ãã®ãããªå Žæããã§ãã¯ããã®ã«åœ¹ç«ã¡ãŸãã
å®å šã§ãªãã€ãã³ããã³ãã©ãŒåŒã³åºã
V3083蚺æ㯠ãã€ãã³ããã³ãã©ãŒã«å¯Ÿããæœåšçã«å®å šã§ãªãåŒã³åºããæ€åºããããã«èšèšãããŠããŸãã åæããããããžã§ã¯ãã§ã¯ããã®èšºæã«ããããã®ãããªå Žæãå€æ°æããã«ãªããŸããã ç¹å®ã®äŸã䜿çšããŠãå®å šã§ãªããã³ãã©ãŒåŒã³åºãã®ç¶æ³ãåæããŸãã
V3083ã€ãã³ããOnKeyEscapeãã®å®å šã§ãªãåŒã³åºããNullReferenceExceptionãçºçããå¯èœæ§ããããŸãã ã€ãã³ããåŒã³åºãåã«ãããŒã«ã«å€æ°ã«ã€ãã³ããå²ãåœãŠãããšãæ€èšããŠãã ããã QuickFind.cs 849
protected void OnPressEscapeKey() { if (OnKeyEscape != null) OnKeyEscape(); }
äžèŠãã³ãŒãã¯å®å šã«æ£ããããã§ããOnKeyEscapeãã£ãŒã«ããnullã§ãªãå Žåããã®ã€ãã³ããçºçãããŸãã ãã ãããã®ã¢ãããŒãã¯æšå¥šãããŸããã OnKeyEscapeã€ãã³ãã«1ã€ã®ãµãã¹ã¯ã©ã€ããŒããããšä»®å®ãããã®ãã£ãŒã«ãã§nullããã§ãã¯ããåŸããã®ãµãã¹ã¯ã©ã€ããŒãïŒããšãã°ãå¥ã®ã¹ã¬ããã§ïŒãã®ã€ãã³ããããµãã¹ã¯ã©ã€ã解é€ãããšããŸãã ã€ãã³ãã«ãµãã¹ã¯ã©ã€ããŒããªãå ŽåãOnKeyEscapeãã£ãŒã«ãã«ã¯ç©ºã®ãªã³ã¯ãå«ãŸããã€ãã³ããçºçãããããšãããšNullReferenceExceptionãçºçããŸãã
ãããéåžžã«é£ããåçŸå¯èœãªãšã©ãŒã§ããããšã¯ç¹ã«äžå¿«ã§ãã ãŠãŒã¶ãŒã¯ãESCãæŒããšãšã©ãŒãçºçãããšäžå¹³ãèšããããããŸããã ãã ããESCã1000åæŒããŠããããã°ã©ããäœãééã£ãŠããã®ããç解ã§ãããšã¯èããããŸããã
è¿œå ã®äžéå€æ°ã宣èšããããšã«ãããã€ãã³ãåŒã³åºããä¿è·ã§ããŸãã
var handler = OnKeyEscape if (handler != null) handler();
CïŒããŒãžã§ã³6ã§ã¯ãnullïŒïŒãïŒCheckã¹ããŒãã¡ã³ãã衚瀺ãããã³ãŒããå€§å¹ ã«ç°¡çŽ åã§ããŸãã
OnKeyEscape?.Invoke();
èããããã¿ã€ããã¹
ã¢ãã©ã€ã¶ãŒã®ãã¥ãŒãªã¹ãã£ãã¯æ©èœã«ãããã³ãŒãå ã®éåžžã«èå³æ·±ãçãããå Žæãæ€åºã§ããŸãã äŸïŒ
V3056 ãa1ãã¢ã€ãã ã®äœ¿çšã®æ£ç¢ºããæ€èšããããšãæ€èšããŠãã ããã LzmaEncoder.cs 225
public void SetPrices(....) { UInt32 a0 = _choice.GetPrice0(); UInt32 a1 = _choice.GetPrice1(); UInt32 b0 = a1 + _choice2.GetPrice0(); UInt32 b1 = a1 + _choice2.GetPrice1(); .... }
ãã®ã³ãŒãã¯ã³ããŒã¢ã³ãããŒã¹ãã䜿çšããŠæžãããå¯èœæ§ããããŸãã ãŸããå€æ°b0ã®å€ãèšç®ããã«ã¯ãå€æ°a1ã®ä»£ããã«å€æ°a0ã䜿çšããå¿ èŠãããããã«æããŸãã ãããã«ãããçºèŠãããçãããå Žæã¯ãéçºè ããã®ã³ãŒãã泚ææ·±ãèŠãæ©äŒã§ããã¯ãã§ãã äžè¬ã«ãããæçãªå€æ°åã䜿çšããæ¹ãé©åã§ãã
åã³äŸå€ãæãã
ãã£ãããããäŸå€ãããã«ã¹ããŒãããã³ãŒãå ã®ããã€ãã®å ŽæãèŠã€ãããŸããã ããã¯ãããšãã°æ¬¡ã®ããã«å®è£ ãããŸãã
public void Copy(string fromPath, string toPath) { .... try { .... } catch (UserCancelException uex) { throw uex; } .... }
ãã®ã¡ãœããããã§ãã¯ãããšãã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®ã¡ãã»ãŒãžã衚瀺ããŸãã
V3052å ã®äŸå€ãªããžã§ã¯ããuexãã飲ã¿èŸŒãŸããŸããã å ã®äŸå€ã®ã¹ã¿ãã¯ã倱ãããå¯èœæ§ããããŸãã FileActions.cs 598
ãã®ãããªäŸå€ã®ã¹ããŒã¯ãå ã®åŒã³åºãã¹ã¿ãã¯ãçŸåšã®ã¡ãœããã§å§ãŸãæ°ãããã®ã«ãã£ãŠäžæžãããããšããäºå®ã«ã€ãªãããŸãã ããã«ããããããã°äžã«å ã®äŸå€ãçºçããå ŽæãèŠã€ããããšãéåžžã«é£ãããªããŸãã
åã³äŸå€ãã¹ããŒãããšãã«å ã®åŒã³åºãã¹ã¿ãã¯ãä¿æããã«ã¯ã throwã¹ããŒãã¡ã³ãã䜿çšããã ãã§ãã
try { .... } catch (UserCancelException uex) { throw; }
ã³ã¬ã¯ã·ã§ã³ãèµ°æ»ãããšãã«çºçããå¯èœæ§ã®ããInvalidCastException
ã³ãŒããããã«åæãããšãæœåšçã«å®å šã§ãªãå Žæãæããã«ãªããŸããã
V3087 ãforeachãã§åæãããå€æ°ã®åã¯ãã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã®åã«ãã£ã¹ãå¯èœã§ãããšã¯éããŸããã VS2005DockPaneStrip.cs 1436
private void WindowList_Click(object sender, EventArgs e) { .... List<Tab> tabs = new List<Tab>(Tabs); foreach (TabVS2005 tab in tabs) .... }
tabsã³ã¬ã¯ã·ã§ã³ã«ã¯Tabåã®èŠçŽ ãå«ãŸããŸãããå埩äžã«ãã®ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã¯Tabåã®åå«ã§ããTabVS2005åã«ãã£ã¹ããããŸãã ãã®ãã£ã¹ãã¯å®å šã§ã¯ãªãããã System.InvalidCastExceptionãã¹ããŒãããå ŽåããããŸãã
åã蚺æã§åæ§ã®å®å šã§ãªãã³ãŒããæ€åºãããŸããïŒ
public int DocumentsCount { get { int count = 0; foreach (DockContent content in Documents) count++; return count; } }
ããã§ã Documentsã³ã¬ã¯ã·ã§ã³ã«ã¯IDockContentèŠçŽ ãå«ãŸããŠããã DockContentåãžã®æ瀺çãªå€æã¯å®å šã§ã¯ãªãå ŽåããããŸãã
é床ã®æ¡ä»¶ä»ããã§ãã¯
æåŸã«ããšã©ãŒãå«ãŸãªãããããã§ãéåžžã«è€éãªã³ãŒãã®äŸãèŠãŠã¿ãŸãããã
V3031éå°ãªãã§ãã¯ãç°¡çŽ åã§ããŸãã ã||ã æŒç®åã¯å察ã®åŒã§å²ãŸããŠããŸãã DockContentHandler.cs 540
internal void SetDockState(....) { .... if ((Pane != oldPane) || (Pane == oldPane && oldDockState != oldPane.DockState)) { RefreshDockPane(Pane); } .... }
æ¡ä»¶PaneïŒ= OldPaneãšPane == oldPaneã¯çžäºã«æä»çã§ããããããã®åŒã¯åçŽåã§ããŸãã
if (Pane != oldPane || oldDockState != oldPane.DockState)
åæ§ã«ãå¥ã®ã¡ãœããã®æ¡ä»¶åŒïŒ
void SetProject(....) { .... if (!internalOpening || (internalOpening && !PluginBase.Settings.RestoreFileSession)) { RestoreProjectSession(project); } .... }
次ã®ããã«ç°¡ç¥åããããšãã§ããŸãã
if (!internalOpening || !PluginBase.Settings.RestoreFileSession)
ãããã«
FlashDevelopãããžã§ã¯ãã¯10幎以äžéçºãããŠãããããªã倧ããªã³ãŒãããŒã¹ãæã£ãŠããŸãã ãã®ãããªãããžã§ã¯ãã§éçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšãããšãèå³æ·±ãçµæãåŸããããœãããŠã§ã¢è£œåã®å質ãåäžããŸãã ãããžã§ã¯ãã®éçºè ãèŠã€ãããšã©ãŒãèŠãããšã¯èå³æ·±ããšæããŸãã CãC ++ããŸãã¯CïŒã®ãã¹ãŠã®éçºè ã¯ãææ°ããŒãžã§ã³ã®PVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒãããŠã³ããŒãã㊠ããããžã§ã¯ãã確èªããããšããå§ãããŸãã
è©Šçšçã§ã¯äžååãªå ŽåïŒ è©³çŽ° ïŒãç§ãã¡ã«é£çµ¡ããŠãããŒã«ã®ãã詳现ãªç 究ã®éµãååŸããããšããå§ãããŸãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒPavel Kusnetsovã PVS-Studioã䜿çšããFlashDevelopã®ãœãŒã¹ã³ãŒãã®ç¢ºèª ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã