使用DCPCrypt实现字符串转SHA256哈希及Lazarus告警问题问询
问题原因及修复方案
两个警告的触发原因
- 警告1(函数返回值未设置):你定义的
getsha256是返回值为String的函数,但代码中没有对函数返回值Result赋值,反而直接在函数内操作Form1的Edit2控件,既不符合函数封装逻辑,也触发了编译器警告。 - 警告2(Digest未初始化):编译器无法识别第三方组件
TDCP_sha256的Final方法会对Digest变量赋值,误以为该变量在未初始化的状态下就被使用,因此抛出警告。
另外现有代码还存在内存泄漏问题:创建的Hash对象使用后没有释放,长期运行会占用多余内存。
修复后的完整代码
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, DCPsha256, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; DCP_sha256_1: TDCP_sha256; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } function getsha256(S: String): String; var Hash: TDCP_sha256; Digest: array[0..31] of byte = (0); // 初始化全0消除未初始化警告 i: integer; str1: string; begin Result := ''; // 先给返回值赋默认值 if S = '' then Exit; Hash := TDCP_sha256.Create(nil); try Hash.Init; Hash.UpdateStr(S); Hash.Final(Digest); str1 := ''; for i := 0 to 31 do str1 := str1 + IntToHex(Digest[i],2); Result := UpperCase(str1); // 给返回值赋值 finally Hash.Free; // 释放对象解决内存泄漏 end; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := getsha256(Edit1.Text); // 直接用函数返回值赋值,降低代码耦合 end; end.
修复后两个警告会完全消除,同时解决了原有内存泄漏问题,函数的复用性也更高。
内容的提问来源于stack exchange,提问作者Wario
相关产品推荐
相关产品推荐

