Как я могу найти, где должен быть вызван статический метод? - PullRequest
0 голосов
/ 18 апреля 2019
public void SomeGoodMethod(Cube cube)
{
  Friends.Show(() => cube.Solve());
}

public void SomeBadMethod(Cube cube)
{
  cube.Solve();
}

Я знаю, что могу найти сотни методов, которые принимают параметр Cube с отражением. Как найти методы, которые не вызывают статический метод: Friends.Show (во время разработки или во время выполнения)?

1 Ответ

0 голосов
/ 19 апреля 2019

Благодаря комментарию Джороэна Мостерта я смог собрать воедино некоторый код.

foreach (var type in types)
{
  var callsShow = false;

  foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
  {
    var byteArray = method.GetMethodBody()?.GetILAsByteArray();
    if (byteArray == null)
    {
      continue;
    }

    var bytes = BitConverter.ToString(byteArray);
    var isMatch = Regex.IsMatch(bytes, "14-.*-28-.*-00-2B-26");
    callsShow = callsShow || isMatch;
  }
  if (!callsShow)
  {
    MightBeBad(type);
  }
}

Я создал экспериментальное выражение, неоднократно вызывая Friends.Show в одном методе с различными параметрами и конфигурациями общих параметров, и искал повторяющиеся последовательности в байтах. YMMV

Из сотен исследованных классов были найдены 2 истинных положительных результата и 10 ложных положительных результатов. Ложные срабатывания звонили изнутри блоков проб и других необычных ситуаций. Тем не менее, мало, чтобы проверить вручную.

Также обратите внимание: шаблон может отличаться между сборками Debug и Release.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...