Как найти все целочисленные деления в исходном коде С#

У меня есть программа с большим количеством математических вычислений. Он был преобразован из VB6, где деление двух целых чисел дает двойное число. Мне нужно найти все места, где он делит два целых числа, чтобы я мог привести целые числа к удвоению, чтобы он выполнял деление с плавающей запятой вместо целочисленного деления.

Лучшее, что я смог придумать, это декомпилировать код с помощью ILDASM и найти 5B.*div в полученном файле .il: https://en.wikipedia.org/wiki/List_of_CIL_instructions

Но есть только одна инструкция для всех типов деления, так что проверить типы аргументов в стековой машине довольно сложно.

Есть ли более надежный способ найти все экземпляры целочисленного деления?

Это довольно убедительный пример того, почему важно правильное покрытие тестами.

Alexey Larionov 18.12.2020 19:54

Расширение Roslyn должно иметь доступ к семантике кода. Вы пробовали это? Какие исследования вы уже провели? Был ли grep текста IL лучшим или единственным, что вы пробовали до сих пор? В чем конкретно вы ищете помощи? Stack Overflow не является подходящим форумом для получения готовых решений с нуля.

Peter Duniho 18.12.2020 19:58

@PeterDuniho Я бы посчитал «Создайте расширение для анализа кода Roslyn, вот 2 или 3 строки соответствующего кода, чтобы указать вам правильное направление» очень хороший ответ на этот вопрос, и я бы отметил это как принятый ответ.

Bryce Wagner 18.12.2020 20:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
3
194
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий Питера Дунихо указал мне правильное направление, чтобы использовать анализатор кода Roslyn. Этот код — отличное место для начала создания анализатора:

https://johkoerner.com/csharp/creating-a-stand-alone-code-analyzer/

Код для этого очень короткий, начните с проекта Extensibility -> Stand-Alone Code Analysis Tool.

void DoAnalysis(string solutionPath)
{
    var ws = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkplace.Create();
    var soln = ws.OpenSolutionAsync(solutionPath).Result;
    foreach (var proj in soln.Projects)
    {
        var compile = proj.GetCompilationAsync().Result;
        foreach (var tree in compile.SyntaxTrees)
        {
            var symantic = compile.GetSemanticModel(tree);
            foreach (var divide in tree.GetRoot().DescendantNodesAndSel()
                .Where(i => i.IsKind(SyntaxKind.DivideExpression))
                .OfType<BinaryExpressionSyntax>())
            {
                if (semantic.GetTypeInfo(divide.Left).ConvertedType.Name == "Int32"
                    && semantic.GetTypeInfo(divide.Right).ConvertedType.Name == "Int32")
                {
                     Consel.WriteLine("File " + tree.FilePath + " at " + divide.Span.Start);
                }
            }
        }
    }
}

Другие вопросы по теме