Расширение платформы для тестирования домашнего задания для включения анализа кода (C/C ++)
-
02-10-2019 - |
Вопрос
Я поддерживаю/разрабатываю платформу для домашних заданий. В основном это автоматически. Теперь мне нужно добавить анализ кода. Мне нужно проверить код на наличие конкретных конструкций.
Например:
Делает файл
main.cpp
содержать класс с именемuser
с методом Constget_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, он, похоже, работает под вином.