2015-08-08 56 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/
  • 信卦分析
  • 簡單字母頻率分析(高括號,大括號,操作符可能表示代碼)