Генерирует предупреждение компилятора, когда определенные значения передаются в параметры - PullRequest
4 голосов
/ 19 мая 2019

Я пишу открытый метод в C #, который выполняет определенные проверки неработоспособности (по соображениям безопасности).

public bool CheckThing(int a, int b, bool secureCheck = true)
{
    if (secureCheck)
    {
        // do this thing slowly but safely
    }
    else
    {
        // do this as fast as possible
    }
    // ...
}

Иногда может оказаться ненужным делать что-то «медленным» способом, и я хотел бы позволить людям в моей команде, которые знают, что они делают, установить значение secureCheck на false.

Я бы хотел, чтобы этот метод выдавал «предупреждение компилятора» в строке, вызывающей этот метод, всякий раз, когда значение secureCheck установлено на false (а не если оно установлено в true). Таким образом, члены команды, которые знают, что они делают, могут подтвердить предупреждение, используя директиву препроцессора #pragma:

#pragma warning disable InsecureCheckWarning // This call was checked by the team lead and is okay
var result = CheckThing(a, b, secureCheck: false)
#pragma warning restore InsecureCheckWarning 

Возможно ли это (возможно, с использованием Roslyn)? Если так, как бы я достиг чего-то подобного?

Для справки, это библиотека .NET Standard 2.0 (и хотя в настоящее время используется C # 7.3, я не против использования C # 8.0 при необходимости).

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Да, этого можно добиться с Рослин.Я бы создал два анализатора:

  1. Посмотрите на все вызовы CheckThing().Если кто-то вызывает этот метод и предоставляет переменную (вместо литерала True или False) для secureCheck, тогда ваш анализатор выдаст ошибку.

  2. Просмотрите все вызовыдо CheckThing().Если кто-то введет False, тогда выдайте предупреждение, которое вы описали в своем вопросе.

Причина, по которой вам нужен первый анализатор, состоит в том, чтобы избежать ситуаций, когда статический анализатор не может определить, чтозначение передается как secureCheck.Например, мы не можем сказать, передается ли True или False во время следующего:

var randomBool = (bool)Console.ReadLine();
var result = CheckThing(a, b, secureCheck: randomBool);

Я некоторое время не создавал анализатор, но я полагаю, что вы перехватитев событие компиляции и искать InvocationExpressionSyntax.Затем вы посмотрите на аргументы, переданные этому методу, и решите, следует ли выдавать ошибку или предупреждение.

0 голосов
/ 19 мая 2019

Не думаю, что эта функция существует, я бы разделил функцию на две:

public bool CheckThingsSecured () {}

[Obsolete ()] public bool CheckThings () {}

...