Я работаю над расширением Roslyn для предупреждения о незащищенном .Value
доступе к Nullable<T>
значениям.
Это обеспечивает следующее поведение:
Это расширение уже вроде как работает, но код для проверки того, является ли доступ «безопасным», является своего рода взломом. Теперь я просто просматриваю синтаксическое дерево в поисках if
заявления.
Этот подход довольно уродлив и выдает кучу недопустимых предупреждений.
Вот несколько примеров случаев, когда доступ x.Value
должен быть безопасным:
int y;
int? x = foo();
y = x != null ? x.Value : 42;
if (x > 4)
y = x.Value;
if (x != null && someExpr) // With && only one branch needs to be a test
y = x.Value;
if (x == 3 || x == 4) // With || both branches must be a test
y = x.Value;
if (x == null) return; // Exit method body before access .Value
y = x.Value;
Есть ли способ использовать SemanticModel
для правильного написания этого теста?
Одна из вещей, о которых я думаю, это сделать абстрактную интерпретацию над синтаксическим деревом. Но это кажется большой работой, и я надеюсь, что полноценный абстрактный интерпретатор не нужен.
Я не совсем уверен, как анализ мертвого кода реализован в Roslyn, но, похоже, это как-то связано с этим.
&&
, а не||
- person SLaks   schedule 06.05.2014