You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:01