2015-08-08 57 views
0

我正在尝试构建一个Linux内核级防火墙,并且需要在其中创建一个DLP(数据丢失防护)层。确定给定的文本是否为C代码

我需要确定一个电子邮件(通过SMTP发送)是C代码还是纯文本。 代码不一定是一个完整的程序,所以我将无法使用编译器来完成此任务。

例如,下面的代码应该被抓:

if (variable == true) { printf("The statement is true\n"); } 

有什么建议?

+1

非常困难,而de依赖于你可以接受的变化范围。那么,为什么你不指定你可以得到什么样的输入! –

+0

它应该是纯文本或部分C代码...这是我收到的规范... –

+2

这是一个愚蠢的/不可能的规范,因为然后'f(变量==真){printf(“The'也是部分C代码。你明白我的意思吗?! –

回答

2

如果是'声明',我会建议得到一个(Lex/Yacc)C语法分析器。将解析器置于'期望声明状态'并运行它。如果你没有得到错误,你知道它是有效的。

根据你得到的解析器,你可能不得不去掉很多代码;像符号表查找/检查什么时候遇到一个变量,......但是如果有(几乎)准备好的裸机实现,我不会感到惊讶。

您也可以下载一个纯粹的C Lex和Yacc规范,并在其周围编写一些代码以使其工作;这并不困难。但它确实需要大量的努力来解决它。

+0

我已经将编译器的一部分编译为词法分析器,这种可疑的乐趣,我希望有一种不同的方式,但似乎没有很好的解决方法......谢谢! –

+0

我能想象的唯一其他方向是文本/词语分析,就像他们用自然语言进行分析一样,然后导致概率。但是,这对于编程语言来说很难(如果完全不能的话)工作,并且这种方法需要一个好的输入数据集。 –

0

对于一个更通用代码VS文本分类你也可以尝试以下任何一项:

  • 火车马尔可夫模型(例如使用CRM114 - http://crm114.sourceforge.net/
  • 信卦分析
  • 简单字母频率分析(高括号,大括号,操作符可能表示代码)