delphi – 有关变量的缺失警告可能尚未初始化
我的代码中有一个错误.毫无疑问;这是我的错,完全是我的错:
procedure TfrmCageSetup.actDeleteFloatExecute(Sender: TObject); var conn: TADOConnection; begin ... if not float.CanDelete(conn,{out}noDeleteReason) then begin ... end; 我忘了初始化变量conn.结果,它是堆栈垃圾.当目标被调用者检查参数时,它会通过: function TFloat.CanDelete(Connection: TADOConnection; out NoDeleteReason: string): Boolean; begin if Connection = nil then raise EArgumentNullException.Create('Connection'); 我有时会遇到非常奇怪的访问冲突. 但为什么Delphi没有抓住它呢? 是的,这是我的错.但部分原因是我使用静态的,强类型的语言,这样可以帮助我捕捉这些愚蠢的错误. 首先,我检查了我实际上并没有将它初始化为某些损坏或被破坏的物体(也许它已被初始化 – 只是非常糟糕).但不,它在声明和首次使用之间真的没有初始化: 然后我想也许我已经关闭了警告:
但不,它已启用(全局,对于我的平台,我的发布类型): 所以然后我再次构建它(即使这个bug在代码中存在了几个月),以确保我没有错过错误.但不是;除了VCL和JVCL中的一些错误外,Delphi没有发现错误: 我希望德尔福帮助我 有什么可以解释这个? 我想知道我的代码中是否还有其他地方有相同,可怕,完全可检测的错误. 也许它是64位编译器.有些人抱怨64位后端(全新)并不像32位后端那样聪明.如果我尝试将其更改为32位怎么办? 仍然没有: 与32位版本和64位版本相同. 2015年1月25日 – 它是否显示出这样的警告? 重现警告的步骤确实显示: procedure TForm1.FormCreate(Sender: TObject); var silverWarrior: Integer; begin IsWrong(silverWarrior); end; function TForm1.IsWrong(n: Integer): Boolean; begin Result := True; end; 发出警告:
您甚至不必将值传递给另一个函数;简单地使用未初始化的变量会发出警告(取决于特定日期编译器的情绪): procedure TForm1.FormCreate(Sender: TObject); var silverWarrior: Integer; theAnswer: Integer; begin theAnswer := silverWarrior + 42; end; 发出警告:
超过32个局部变量导致失败? 没有;你仍然得到警告: procedure TForm1.FormCreate(Sender: TObject); var localVariable1: Integer; localVariable2: Integer; localVariable3: Integer; localVariable4: Integer; localVariable5: Integer; localVariable6: Integer; localVariable7: Integer; localVariable8: Integer; localVariable9: Integer; localVariable10: Integer; localVariable11: Integer; localVariable12: Integer; localVariable13: Integer; localVariable14: Integer; localVariable15: Integer; localVariable16: Integer; localVariable17: Integer; localVariable18: Integer; localVariable19: Integer; localVariable20: Integer; localVariable21: Integer; localVariable22: Integer; localVariable23: Integer; localVariable24: Integer; localVariable25: Integer; localVariable26: Integer; localVariable27: Integer; localVariable28: Integer; localVariable29: Integer; localVariable30: Integer; localVariable31: Integer; localVariable32: Integer; localVariable33: Integer; localVariable34: Integer; localVariable35: Integer; localVariable36: Integer; localVariable37: Integer; localVariable38: Integer; localVariable39: Integer; localVariable40: Integer; localVariable41: Integer; localVariable42: Integer; localVariable43: Integer; localVariable44: Integer; localVariable45: Integer; localVariable46: Integer; localVariable47: Integer; localVariable48: Integer; localVariable49: Integer; silverWarrior: Integer; theAnswer: Integer; begin theAnswer := silverWarrior + 42; end;
解决方法
就是这样.编译器并不完美发现此类错误.除了您的问题(编译器未能警告的未初始化变量)之外,很可能遇到编译器发出警告的初始化变量.为了弥补痛苦,可能会有32位编译器发出警告的代码,但64位编译器却没有.反之亦然,有时64位编译器会发出警告,而32位编译器则不会.
我没有找到任何模式.我没有解决方案.我有一个暗示控制语句如break和exit可能与这些问题有关,但我没有硬性证据就是这样. 只有Embarcadero可以解决这个问题,所以你能做的最好就是提交一份错误报告,希望Embarcadero的某个人能够关心. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |