LINUX.ORG.RU

Сравнение двух исходников

 , corrections programs


0

2

Добрый день. Имеется такая задача: допустим, есть два исходника одной и той же программы(задачи). Язык заранее известен. Один исходник выдает правильный результат, второй нет. Необходимо сравнить их и программно понять, почему первый проходит, а второй нет.

Например:

1.

 
int c;
cin >> c;
...
if (c == 1)

2.

long long c;
cin  >> c;
...
if (c != 1)

Пусть второй код будет правильный, тогда причина почему первый не проходит в типе переменной c и знака сравнения.

Мои идеи, как это все реализовать. Для начала реализовать аналог diff. Далее для полученных строк построить синтаксическое дерево(с помощью antlr, например). Чтобы была возможность определить тип переменной. И уже сравнить два дерева.

Возможно, есть другие идеи как это все реализовать. У кого какие мысли?

Пусть второй код будет правильный, тогда причина почему первый не проходит в типе переменной c и знака сравнения.

с чего это вдруг? Формально, т.е. только лишь исходя из начальных данных, нельзя сделать такой вывод.

Далее для полученных строк построить синтаксическое дерево

так работать не будет, отдельно строки не являются валидными частями языка. diff нужно делать от деревьев.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Имелось в виду, что diff нам показал различия в этих строках:

int c; | long long c;
if (c == 1) | if (c != 1)
Причем первый код выдает неправильный результат по начальным данным, а второй - правильный. Отсюда и можно сделать вывод, что либо идет переполнение типа, либо неправильный знак сравнения, либо то и другое одновременно.

Т.е. вы предлагаете сначала построить два дерева для двух исходников и потом их уже сравнивать?

Hammernv
() автор топика
Ответ на: комментарий от anonymous

Не понимаю, каким образом мне поможет LLVM в данном случае.

Hammernv
() автор топика
Ответ на: комментарий от Hammernv

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

это уже три пути ошибки. А в реальном диффе может быть намного больше комбинаций. Чем это лучше для человека по сравнению с простым чтением текстового diff'а глазами?

mashina ★★★★★
()
Ответ на: комментарий от mashina

Чем это лучше для человека по сравнению с простым чтением текстового diff'а глазами?

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

А в реальном диффе может быть намного больше комбинаций.

Но тут все дело в предметной области. В той, которую я рассматриваю, комбинаций не так уж и много.

Собственно, идея реализации остается открытой.

Hammernv
() автор топика
Ответ на: комментарий от mashina

clang умеет выдавать AST, к нему можно применять diff.

Для построения AST мне все же ближе ANTLR. И все в итоге упирается в сравнение двух деревьев?

Hammernv
() автор топика
Ответ на: комментарий от mashina

А немножко подумать над работами Гёделя (Курта), и совсем немножко о Тьюринге, Посте, Чёрче, Маркове, Колмогорове?

ABW ★★★★★
()
Ответ на: комментарий от Hammernv

Для построения AST мне все же ближе ANTLR.

Он навряд ли умеет разворачивать макросы. Без этого не все сорцы получится распарсить.

И все в итоге упирается в сравнение двух деревьев?

Что, всё? Как я понял, тебе только это и нужно.

mashina ★★★★★
()
Ответ на: комментарий от Hammernv

Диффить текст, далее построчно комбинировать оба исходника, пока не будет обнаружена «ключевая» строчка. Что делать, если будет слишком много некомплирующихся комбинаций - хз, пока не придумал.

annulen ★★★★★
()
Ответ на: комментарий от Hammernv

что у человека нет возможности сравнения своего исходники с другими

почему?

а у программы есть

и что программа будет делать с найденными отличиями?

anonymous
()
Ответ на: комментарий от anonymous

почему?

Нет прав, например.

и что программа будет делать с найденными отличиями?

Заносить их в БД, например. Ну это уже другой разговор. Мы ушли в другую сторону.

Hammernv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.