加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 有关变量的缺失警告可能尚未初始化

发布时间:2020-12-15 09:35:05 所属栏目:大数据 来源:网络整理
导读:我的代码中有一个错误.毫无疑问;这是我的错,完全是我的错: procedure TfrmCageSetup.actDeleteFloatExecute(Sender: TObject);var conn: TADOConnection;begin ... if not float.CanDelete(conn,{out}noDeleteReason) then begin ...end; 我忘了初始化变量c
我的代码中有一个错误.毫无疑问;这是我的错,完全是我的错:

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没有抓住它呢?

是的,这是我的错.但部分原因是我使用静态的,强类型的语言,这样可以帮助我捕捉这些愚蠢的错误.

首先,我检查了我实际上并没有将它初始化为某些损坏或被破坏的物体(也许它已被初始化 – 只是非常糟糕).但不,它在声明和首次使用之间真的没有初始化:

然后我想也许我已经关闭了警告:

Variable might not have been initialized

但不,它已启用(全局,对于我的平台,我的发布类型):

enter image description here

所以然后我再次构建它(即使这个bug在代码中存在了几个月),以确保我没有错过错误.但不是;除了VCL和JVCL中的一些错误外,Delphi没有发现错误:

enter image description here

我希望德尔福帮助我

有什么可以解释这个?

我想知道我的代码中是否还有其他地方有相同,可怕,完全可检测的错误.

也许它是64位编译器.有些人抱怨64位后端(全新)并不像32位后端那样聪明.如果我尝试将其更改为32位怎么办?

仍然没有:

enter image description here

与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;

发出警告:

W1036 Variable ‘silverWarrior’ might not have been initialized

您甚至不必将值传递给另一个函数;简单地使用未初始化的变量会发出警告(取决于特定日期编译器的情绪):

procedure TForm1.FormCreate(Sender: TObject);
var
   silverWarrior: Integer;
   theAnswer: Integer;
begin
   theAnswer := silverWarrior + 42;
end;

发出警告:

W1036 Variable ‘silverWarrior’ might not have been initialized

超过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;

W1036 Variable ‘silverWarrior’ might not have been initialized

解决方法

就是这样.编译器并不完美发现此类错误.除了您的问题(编译器未能警告的未初始化变量)之外,很可能遇到编译器发出警告的初始化变量.为了弥补痛苦,可能会有32位编译器发出警告的代码,但64位编译器却没有.反之亦然,有时64位编译器会发出警告,而32位编译器则不会.

我没有找到任何模式.我没有解决方案.我有一个暗示控制语句如break和exit可能与这些问题有关,但我没有硬性证据就是这样.

只有Embarcadero可以解决这个问题,所以你能做的最好就是提交一份错误报告,希望Embarcadero的某个人能够关心.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读