掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オーバーフローチェックをONにすると番地がずれる (ID:149611)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になります、OTAと申します。 Win10 Pro x64環境にてDelphi 10.2を使用しているのですが、32ビット用アプリケーションで不可解なコードが生成されて頭をかかえています。 何か思いつく方は、お助け頂ければ幸いです。 以下、手順です。 プロジェクトオプションのオーバーフローのチェックをONにします(※OFFだと発生しません)。 Formに1つボタンを置き、下記のようなコードを作成して実行すると、ボタンクリック時に'Err'が表示されます。 type TTotalRec = packed record Enabled : Boolean; Value : Double; public procedure SetValue( const num : Double ); end; procedure TTotalRec.SetValue( const num : Double ); begin Value := num; Enabled := True; end; procedure TForm8.Button1Click(Sender: TObject); var i, deg : Integer; trec : array[0..0] of TTotalRec; begin FillChar( trec, SizeOf( trec ), #0 ); i := 0; deg := 45; trec[i].SetValue( DegToRad( deg ) ); if ( trec[i].Enabled = False ) or ( trec[i].Value <> DegToRad( deg ) ) then begin Caption := 'Err'; end; end; 私の期待するところは、Captionに'Err'とは表示されないことです。 DelphiのCPU Windowを見る限り、TTotalRec.SetValueが呼ばれた時Selfの番地が正しくないようです。 下記、005D4EBCの行にあるようにtrecの番地は[ebp-$15]だと思うのですが、 Unit8.pas.45: FillChar( trec, SizeOf( trec ), #0 ); 005D4EBC 8D45EB lea eax,[ebp-$15] 005D4EBF 33C9 xor ecx,ecx 005D4EC1 BA09000000 mov edx,$00000009 005D4EC6 E80129E3FF call @FillChar 下記の005D4F14の行では、[ebp+eax-$25]をeaxにセットしてTTotalRec.SetValueがCallされています。 この時eaxは0なので最終的に[ebp-$25]となり、どうやら番地を$10ほど引きすぎています。 (実際、call TTotalRec.SetValueの直前で、eaxに[ebp$-15]の値をセットしてやると'Err'は表示されませんでした) Unit8.pas.48: trec[i].SetValue( DegToRad( deg ) ); (省略) 005D4F08 9B wait 005D4F09 6B45F809 imul eax,dword ptr [ebp-$08],$09 005D4F0D 7105 jno $005d4f14 005D4F0F E8982CE3FF call @IntOver 005D4F14 8D4405DB lea eax,[ebp+eax-$25] 005D4F18 E86FFFFFFF call TTotalRec.SetValue コンパイラの不具合のようにも見えますが、私は何かまずい組み方、または勘違いをしているでしょうか。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.