読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(macro-of-inline) return文のgoto化に成功

inline関数の中にガード的なreturn文があると, そのreturnは危険であるという話をしました. その問題に対して, 関数ブロックの末尾にラベルを挿入して, ブロック中のreturn文を全部gotoに書換えることで対処するということを話しました.

あと, これは簡単ですが, LabelとかGotoが入ってる関数についてはマクロ化対象から除外するコードを書きました.

Before:

inline void fun(int x)
{
  if (1)
  {
    return;
  }

  while (1)
  {
    return;
  }

  return;
}

After:

inline void fun(int x)
{
  int zRPxmBXilFOemgSU = x;
  if (1)
  {
    goto exit_func_compound;
  }

  while (1)
  {
    goto exit_func_compound;
  }

  goto exit_func_compound;
  exit_func_compound:
  ;

}