我正在维护/开发家庭作业测试平台。它主要是自动的。我现在需要添加的是代码分析。我需要检查代码是否特定构造。

例如:

做文件 main.cpp 包含一个名称的课程 user 使用const方法 get_name()?

是否有一些工具可以让我做这样的事情(理想是可以脚本脚本的)。仅Linux。

有帮助吗?

解决方案 4

我从Mozilla发现了Dehydra工具。它似乎主要是出于内部目的而写的,但这可能正是我想要的。

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

编辑:Dehydra很棒。它缺少一些较小的功能,例如确定const方法,但否则很棒。

其他提示

一种可能性可能是通过代码运行 海湾合作委员会 并使用 GCC-XML 扩展以产生程序内部结构的XML描述。然后,您可以使用自己喜欢的XML库来解析文档,或者如果需要做的就是将其显示为HTML或其他任何内容,则可以对其应用XSLT。

您可能可以将使用的东西组合在一起 GCC-XML框架 没有太多困难。

这如何适用 C? :)

文件main.cpp是否包含具有const方法get_name()的名称用户的类?

使用另一个文件(test.cpp)

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

编译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.ctest.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软件重新设计工具包 将提供与GCC-XML相同的抽象信息,但还包括定义内容的完整详细信息(例如,方法主体信息) C ++前端. 。这将使您访问妄想 内容以检查您的学生课程。

DMS为ASTS,符号表和源模式匹配提供通用解析。 C ++前端提供完整的C ++解析,构建C ++ AST和相应的符号信息。之后,您要做的是您的识别取决于您,但是您的示例似乎是在寻找特定模式。

您的示例的一半将由C ++的几个DMS源模式来处理:

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代表metavariobles p,m和s,必须在语法上是参数列表,分别为参数列表,一个方法列表和语句列表在为了匹配图案。参数列表等的定义会自动从C ++前端的C ++语法部分得出。

另一半由调用C ++解析器和名称/类型解析器后执行的DMS Parlanse代码实现:

   (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

通过一些自由来简化演讲。

这是一个非常简单的检查;您可以从Parlanse代码访问符号表,以进行更复杂的检查是否有意义。

虽然DMS不直接在Linux下运行,但它似乎确实在葡萄酒下运行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top