Расширение платформы для тестирования домашнего задания для включения анализа кода (C/C ++)

StackOverflow https://stackoverflow.com/questions/3710532

Вопрос

Я поддерживаю/разрабатываю платформу для домашних заданий. В основном это автоматически. Теперь мне нужно добавить анализ кода. Мне нужно проверить код на наличие конкретных конструкций.

Например:

Делает файл main.cpp содержать класс с именем user с методом Const get_name()?

Есть ли какой -то инструмент, который позволил бы мне делать такие вещи (идеально было бы чем -то, что можно сценаривать). Только Linux.

Это было полезно?

Решение 4

Я обнаружил инструмент Dehydra из Mozilla. Кажется, это в основном написано для внутренних целей, но это может быть именно то, что я искал.

https://developer.mozilla.org/en/dehydra/using_dehydra

РЕДАКТИРОВАТЬ: Дегидра великолепна. Отсутствует некоторые незначительные функции, такие как определение методов Const, но в остальном отличное.

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

Одной из возможностей может быть запуск кода через GCC и используйте GCC-XML Расширение для получения XML -описаний внутренней структуры программы. Затем вы можете использовать свою любимую библиотеку XML для анализа документа или применить к нему XSLT, если все, что вам нужно сделать, это отобразить его как HTML или что -то еще.

Вы, вероятно, могли бы взломать что -то, что использовало GCC-XML Framework без особых трудностей.

Как это относится к C? :)

Содержит ли файл main.cpp класс с именем пользователя с методом const get_name ()?

Создайте другой файл (test.cpp) с

void test(void) {
  const user x;
  x.get_name();
}

compile test.cpp и main.cpp вместе. Если есть ошибка (выход кода! = 0), тогда НЕТ!, файл main.cpp не определяет (публичный) класс с именем пользователя с конкретным методом.

Предостережение: я знаю нет C++, поэтому извините за любые серьезные (или незначительные) ошибки в вышеперечисленном.


Редактировать добавлен сценарий

#! /bin/sh

cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c

У меня нет готового к использованию C++ Компилятор установлен на этой машине, я работаю, поэтому мой тест был с C компилятор и C файлы Мой компилятор не "работал" gcc -combine main.c test.c Так что я настроил эту часть.

Запуск этого сценария с рабочей комбинацией main.c и test.c Выходы «ОК», в противном случае он выводит «bzzzt».


Для тестов я использовал это main.c

typedef int user;

int get_name(void) {
  return 0;
}

int main(void) {
  return 0;
}

и это test.c

void test(void) {
  const user x;
  get_name();
}

Образец пробега

$ ./3710532.sh
OK

Если вы хотите провести произвольный анализ кода, вам нужен произвольный анализ/сопоставление/и т. Д. GCC-XML предоставит вам информацию об декларации, но не содержание методов.

Наш DMS Software Reenerineering Toolkit предоставит ту же абстрактную информацию, что и GCC-XML, но дополнительно включает в себя полные детали для содержания определений (например, информация о методе метода), поддерживаемая его F ++ Front End. Анкет Это позволит вам получить доступ к Delcarations и Контент, чтобы проверить ваши студенческие программы.

DMS обеспечивает анализ общего назначения для AST, символов и сопоставления источников. Передняя часть C ++ обеспечивает полное анализ C ++, здание C ++ AST и соответствующую информацию символа. То, что вы делаете после этого для распознавания, зависит от вас, но ваш пример, похоже, заключается в поиске определенного шаблона.

Половина вашего примера будет обрабатываться несколькими шаблонами источника DMS для C ++:

pattern is_correct_student_class(m:members):class =
  " class user { \m } ".

pattern is_correct_student_method_present(p:parameters,s:statements):method =
  " const  get_name(\p) { \s } "

(Простите мой синтаксис C ++, я не пишу много), который будет соответствовать любому AST соответственно, соответственно, соответственно, соответственно, и желаемый метод Const. Цитаты-это мета-цитаты, и материал внутри синтаксиса C ++ с Escapes P, M и S, представляющими метавариальные P, M и S, которые должны синтаксически быть списком параметров, список методов и операторов соответственно в порядок соответствовать шаблону. Определения списка параметров и т. Д. Автоматически получены из грамматической части C ++ передней части C ++.

Другая половина реализована небольшим количеством кода DMS Parlanse, выполненного после вызова анализатора C ++ и Resolver с именем/типом:

   (define has_student_code (lamdba (function boolean [tree AST]))
      (AST:IsInTree tree
          (lambda (function boolean [tree1 AST]
              (&& (Registry:MatchPattern tree1 "is_correct_student_class")
                  (AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
                       (lambda (function boolean [tree2 AST]) 
                           (Registry:MatchPattern tree2 ; a member
                                 "is_correct_student_method_present")
                       )lambda
          )lambda
      )
   )define

с некоторыми свободами, взятыми для упрощения презентации.

Это довольно простая проверка; Вы можете получить доступ к таблице символов из Кодекса «Парлана», чтобы сделать более сложную проверку, если это имеет смысл.

Хотя DMS не работает непосредственно под Linux, он, похоже, работает под вином.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top