• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      OnlineJudge中反抄襲機(jī)制的研究和實(shí)現(xiàn)

      2016-09-07 05:20:57李潤(rùn)東
      關(guān)鍵詞:源碼標(biāo)識(shí)符源代碼

      王 寧,李潤(rùn)東

      (湖南工程學(xué)院 計(jì)算機(jī)與通信學(xué)院,湘潭 411104)

      ?

      OnlineJudge中反抄襲機(jī)制的研究和實(shí)現(xiàn)

      王寧,李潤(rùn)東

      (湖南工程學(xué)院 計(jì)算機(jī)與通信學(xué)院,湘潭 411104)

      OnlineJudge中的反抄襲機(jī)制可以檢測(cè)到其在使用過(guò)程中的作弊現(xiàn)象,為了更深入地了解OnlineJudge的反作弊的實(shí)現(xiàn)原理,以HUSTOJ(眾多OJ中的一種)為研究對(duì)象,剖析其中的SIM相似度檢測(cè)軟件的運(yùn)行機(jī)制,以及在HUSTOJ中實(shí)現(xiàn)反作弊的方法.實(shí)驗(yàn)結(jié)果直觀的表明了SIM相似度檢測(cè)軟件的有效性.

      OnlineJudge;反抄襲;HUSTOJ;SIM;相似度檢測(cè)

      OnlineJudge[1],即在線評(píng)判系統(tǒng)(簡(jiǎn)稱OJ),被廣泛的運(yùn)用到現(xiàn)代教育教學(xué)中,尤其是在計(jì)算機(jī)類的學(xué)科的教學(xué)中,老師將題目發(fā)布到OJ系統(tǒng)中去,學(xué)生通過(guò)web端提交代碼至服務(wù)器,服務(wù)器接受到用戶提交的代碼之后,進(jìn)行編譯、運(yùn)行、評(píng)判后將結(jié)果返回給web端,將結(jié)果非常直觀的反饋給學(xué)生.

      OJ系統(tǒng)方便了老師的教學(xué),但是有些學(xué)生將別人的代碼進(jìn)行修改之后提交給OJ,這就產(chǎn)生了作弊的現(xiàn)象,這就阻礙了OJ系統(tǒng)在教學(xué)中的應(yīng)用,因此需要一套可以對(duì)提交的代碼進(jìn)行相似度檢測(cè)工具來(lái)杜絕此類現(xiàn)象的發(fā)生.HUSTOJ[2],是眾多OJ中的一種,它使用開(kāi)源的SIM軟件[3-4]來(lái)對(duì)代碼進(jìn)行相似度的檢測(cè),很好的解決了這個(gè)問(wèn)題.

      圖1 HUSTOJ

      1 SIM介紹

      1.1相似度檢測(cè)的常用方法

      相似度檢測(cè)一般有如下兩種方法[5]:

      1.1.1屬性計(jì)數(shù)法

      屬性計(jì)數(shù)法通過(guò)提取兩段代碼中的運(yùn)算符,操作符,行數(shù),字符數(shù),程序注釋等相關(guān)屬性的數(shù)量,并將它們表示為N元組,對(duì)N元組進(jìn)行規(guī)范化,并計(jì)算他們的歐幾里得距離,由此來(lái)判斷源碼的相似度.缺點(diǎn):如果抄襲者加入一些多余的關(guān)鍵字,變量,甚至一些冗余的源碼,系統(tǒng)便很難檢測(cè),而對(duì)于不屬于抄襲甚至完全不相關(guān)的源碼,由于屬性個(gè)數(shù)相近的原因可能存在較大的誤判概率.

      1.1.2結(jié)構(gòu)度量法

      結(jié)構(gòu)度量法從程序的結(jié)構(gòu)上進(jìn)行分析,避開(kāi)了任何冗余代碼,主要分2個(gè)步驟:

      (1)首先對(duì)源碼進(jìn)行詞法或語(yǔ)法分析并產(chǎn)生符號(hào)序列,在此過(guò)程中將同義詞映射為統(tǒng)一的形式,將自定義的標(biāo)識(shí)符轉(zhuǎn)換為標(biāo)準(zhǔn)符號(hào),刪除空白符號(hào)和注釋,將大小寫字母轉(zhuǎn)化為小寫等;

      (2)采用相關(guān)字符串匹配技術(shù)比較前面產(chǎn)生的符號(hào)序列,并求出其相似度.

      1.2SIM工作原理

      1.2.1SIM的工作方法

      SIM屬于結(jié)構(gòu)度量法,首先,SIM將提交的源代碼用linux下的Lex詞法分析工具[6]進(jìn)行壓縮,Lex將源代碼轉(zhuǎn)換成相應(yīng)的標(biāo)識(shí)符(token),轉(zhuǎn)化之后的標(biāo)識(shí)符很容易的被后續(xù)階段處理,源代碼就表示成為了另外一種緊縮的格式,并建立相應(yīng)的向前引用表,再采用一種檢測(cè)DNA序列相似性的算法,將壓縮串分成若干份,將每份壓縮串與另外的壓縮串中進(jìn)行匹配,匹配出來(lái)的子串將被刪除,直到不出現(xiàn)匹配的子串為止.在OJ中,系統(tǒng)只將當(dāng)前用戶與對(duì)應(yīng)題目的以往用戶的正確代碼進(jìn)行匹配,如果相似度達(dá)到某個(gè)閥值,就會(huì)在相對(duì)應(yīng)的數(shù)據(jù)庫(kù)中留下相關(guān)的記錄.

      1.2.2SIM軟件中主要文件以及作用

      sim.c獲得命令行參數(shù),檢查參數(shù),初始化語(yǔ)言,預(yù)計(jì)算表.

      compare.c進(jìn)行比較

      tokenarray.c使用lex對(duì)輸入進(jìn)行處理.TokenArray[]記錄著所有輸入的標(biāo)識(shí)符.

      pass1.c讀取文件

      pass2.c找到每個(gè)運(yùn)行線程的確切位置

      pass3.c打印出相似度.

      1.2.3SIM軟件的工作步驟

      (1)文件讀取

      用Lex詞法分析工具對(duì)每個(gè)文件的輸入進(jìn)行標(biāo)識(shí).每個(gè)標(biāo)示占一個(gè)字節(jié),可能會(huì)占滿8位.標(biāo)識(shí)符存儲(chǔ)在TokenArray[]這個(gè)數(shù)組里面,如果溢出了,那么再分配內(nèi)存.為了盡可能的優(yōu)化pass2,一個(gè)辦法就是去記住每行開(kāi)始的那個(gè)標(biāo)識(shí)符的位置.標(biāo)識(shí)符的位置存儲(chǔ)在nl_buff[]這個(gè)數(shù)組里面,如果一樣,也可以進(jìn)行再分配.如果由于缺少內(nèi)存而失敗,nl_buff[]會(huì)被舍棄,pass2會(huì)繼續(xù)的讀取文件.

      (2)建立向前引用表

      文本通過(guò)對(duì)每個(gè)子串和它右邊的子串來(lái)進(jìn)行比較,通過(guò)hash表可以更加的快速的去執(zhí)行.一旦整個(gè)文本被讀入,一張向前引用表就被建立.

      (3)確定運(yùn)行線程的集合

      如果在一個(gè)新文件中,在給定的位置找到一個(gè)正確的運(yùn)行,就調(diào)用add_run()函數(shù),跳過(guò)這個(gè)新文件,阻止重復(fù)的運(yùn)行.

      (4)確定每個(gè)運(yùn)行的線程的確切的位置

      (5)按順序打印出的結(jié)果

      2 反抄襲在HUSTOJ中的實(shí)現(xiàn)

      2.1HUSTOJ的運(yùn)行機(jī)制

      在HUSTOJ中,web端和core的連接方式默認(rèn)是通過(guò)數(shù)據(jù)庫(kù)連接 ,交互的過(guò)程主要是以下四個(gè)步驟:

      (1)有新的代碼提交至服務(wù)器時(shí),web端向solution表中插入記錄;

      (2)core輪詢solution表,當(dāng)發(fā)現(xiàn)有新的記錄時(shí)執(zhí)行相應(yīng)的操作;

      (3)core更新solution表的result字段;

      (4)web端輪詢solution表將result字段顯示出來(lái).

      流程圖如圖2所示.

      圖2 HUSTOJ工作流程圖

      2.2在HUSTOJ中啟用SIM

      在HUSTOJ的配置文件中有一個(gè)OJ_SIM_ENABLE=1的配置項(xiàng),用來(lái)確定是否使用SIM進(jìn)行代碼相似度的檢測(cè).

      有一個(gè)專門的sim表存放著相關(guān)的信息,如圖3所示.

      圖3 sim表結(jié)構(gòu)

      如果啟用了這個(gè)配置項(xiàng),那么core在進(jìn)行處理的時(shí)候,會(huì)調(diào)用SIM來(lái)進(jìn)行代碼相似度的檢測(cè),并將結(jié)果更新至sim表中.

      Core中使用SIM去進(jìn)行代碼相似度檢測(cè)的關(guān)鍵代碼如下:

      intget_sim(intsolution_id,intlang,intpid,int&sim_s_id) {

      charsrc_pth[BUFFER_SIZE];

      //charcmd[BUFFER_SIZE];

      sprintf(src_pth, "Main.%s",lang_ext[lang]);

      intsim=execute_cmd("/usr/bin/sim.sh%s%d",src_pth,pid);

      if(!sim) {

      execute_cmd("/bin/mkdir../data/%d/ac/",pid);

      execute_cmd("/bin/cp%s../data/%d/ac/%d.%s",src_pth,pid,solution_id,

      lang_ext[lang]);

      //ccppwill

      if(lang== 0)

      execute_cmd("/bin/ln../data/%d/ac/%d.%s../data/%d/ac/%d.%s",pid,

      solution_id,lang_ext[lang],pid,solution_id,

      lang_ext[lang+ 1]);

      if(lang== 1)

      execute_cmd("/bin/ln../data/%d/ac/%d.%s../data/%d/ac/%d.%s",pid,

      solution_id,lang_ext[lang],pid,solution_id,

      lang_ext[lang- 1]);

      }else{

      FILE*pf;

      pf=fopen("sim", "r");

      if(pf) {

      fscanf(pf, "%d%d", &sim, &sim_s_id);

      fclose(pf);

      }

      }

      if(solution_id<=sim_s_id)

      sim= 0;

      returnsim;

      }

      當(dāng)用戶提交代碼給服務(wù)器的時(shí)候,core讀取配置文件,如果在配置文件中啟用了SIM相似度檢測(cè),那么core在判題的過(guò)程中調(diào)用以上代碼,調(diào)用/usr/bin/sim.sh來(lái)進(jìn)行代碼相似度的檢測(cè),當(dāng)發(fā)現(xiàn)是抄襲的代碼時(shí),講結(jié)果記錄到數(shù)據(jù)庫(kù)中.

      3 實(shí)驗(yàn)結(jié)果

      在實(shí)驗(yàn)過(guò)程中,我們將已經(jīng)通過(guò)的代碼進(jìn)行如下的“抄襲”的處理.

      已經(jīng)通過(guò)的代碼:

      #include

      intmain()

      {

      inta[5],i,j,max;

      for(i=0;i<5;i++)

      {

      scanf("%d",&a[i]);

      }

      for(j=0;j<5;j++)

      {

      for(i=0;i<5-j-1;i++)

      {

      if(a[i]>a[i+1])

      {

      max=a[i];

      a[i]=a[i+1];

      a[i+1]=max;

      }

      }

      }

      for(i=0;i<5;i++)

      {

      printf("%d",a[i]);

      }

      printf(" ");

      return0;

      }

      我們對(duì)已經(jīng)通過(guò)的代碼進(jìn)行兩次處理,處理過(guò)的代碼一在其基礎(chǔ)上修改了變量的名稱,結(jié)構(gòu)沒(méi)有變,預(yù)測(cè)是完全抄襲;處理過(guò)的代碼二在其基礎(chǔ)上修改了變量名以及程序的結(jié)構(gòu),預(yù)測(cè)屬于部分抄襲.

      將處理過(guò)的代碼提交給OJ系統(tǒng),web端顯示的結(jié)果如下:

      然后查看數(shù)據(jù)庫(kù)中的sim表中的記錄:

      可以很清楚的看出處理過(guò)的代碼一的相似度是100,處理過(guò)的代碼二的相似度是92,結(jié)果是比較準(zhǔn)確的.

      由結(jié)果可以得出結(jié)論,在HUSTOJ中,SIM可以有效的去對(duì)用戶提交上來(lái)的源代碼進(jìn)行相似度檢測(cè)!

      4 結(jié)束語(yǔ)

      通過(guò)對(duì)OnlineJudge中所采用的反作弊機(jī)制的

      分析, 以及實(shí)驗(yàn)?zāi)M, 可以看出SIM代碼相似度檢測(cè)軟件可以很好的去解決用戶在使用OJ的過(guò)程中存在的抄襲現(xiàn)象,可以有效的減少抄襲現(xiàn)象的發(fā)生.

      [1]陳榮欽,胡永良,應(yīng)建健,郭賢海. 在線評(píng)測(cè)系統(tǒng)中的源碼相似度檢測(cè)研究與實(shí)現(xiàn)[J]. 實(shí)驗(yàn)技術(shù)與管理,2014(4):109-111.

      [2]張浩斌. 基于開(kāi)放式云平臺(tái)的開(kāi)源在線評(píng)測(cè)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)科學(xué),2012(S3):339-343.

      [3]DickGrune.http://www.dickgrune.com/[EB/OL].

      [4]胡正軍. 程序代碼相似度檢測(cè)方法研究及應(yīng)用[D].中南大學(xué)碩士學(xué)位論文,2012.

      [5]莊奇東,王鍵聞,張楠,張爽,任娜.OnlineJudge系統(tǒng)的優(yōu)化[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2011(8):115-121.

      ResearchandImplementofAnti-copyingMechanismonOnlineJudge

      WANGNing,LIRun-dong

      (CollegeofComputerandCommunication,HunanInsitituteofEngineering,Xiangtan411104,China)

      Theanti-copyingmechanismofOnlineJudgecandetectthecheatinginOnlineJudgeduringtheusage.Tostudythetheoryofanti-copyingmechanism,thisarticleusesHUSTOJastheresearchobjecttoanalyzetheoperatingmechanismoftextsimilaritytesterSIMinthesystemandthewayofachievingit.TheresultofexperimentshowstheeffectivenessoftextsimilaritytesterSIM.

      OnlineJudge;anti-plagiarism;HUSTOJ;SIM;similaritydetection

      2015-09-28

      湖南省教育廳普通高等學(xué)校教學(xué)改革研究項(xiàng)目(湘教通[2014]247-414).

      王寧(1982-),男,講師,研究方向:無(wú)線網(wǎng)絡(luò)及應(yīng)用.

      TP393

      A

      1671-119X(2016)01-0045-04

      猜你喜歡
      源碼標(biāo)識(shí)符源代碼
      人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
      淺析5G V2X 通信應(yīng)用現(xiàn)狀及其側(cè)鏈路標(biāo)識(shí)符更新技術(shù)
      基于網(wǎng)頁(yè)源碼結(jié)構(gòu)理解的自適應(yīng)爬蟲(chóng)代碼生成方法
      基于圖神經(jīng)網(wǎng)絡(luò)的軟件源碼漏洞檢測(cè)方法
      基于底層虛擬機(jī)的標(biāo)識(shí)符混淆方法
      基于TXL的源代碼插樁技術(shù)研究
      企業(yè)如何保護(hù)源碼
      基于區(qū)塊鏈的持久標(biāo)識(shí)符系統(tǒng)①
      軟件源代碼非公知性司法鑒定方法探析
      數(shù)字美術(shù)館“數(shù)字對(duì)象唯一標(biāo)識(shí)符系統(tǒng)”建設(shè)需求淺議
      广元市| 开江县| 高台县| 凉山| 湛江市| 恭城| 六枝特区| 北流市| 寿宁县| 抚州市| 龙游县| 奉新县| 普洱| 壤塘县| 桃园县| 穆棱市| 常熟市| 临湘市| 边坝县| 翁源县| 万宁市| 无棣县| 邳州市| 宜兰市| 苏州市| 大荔县| 富宁县| 建始县| 桐城市| 原平市| 潮州市| 泾源县| 揭阳市| 涟水县| 永登县| 嘉祥县| 盐津县| 神池县| 大石桥市| 北流市| 甘德县|