杜彬 賀杰 徐陽 王林鑫 尤楓
摘要:針對程序初學者編寫的C/C++程序,調試需要消耗大量的時間和精力。然而,初學者在接觸簡單的編程時,編寫思路一般不存在問題,但由于其良好的編程習慣還未養(yǎng)成,代碼格式往往不規(guī)范,從而導致程序相應代碼塊出錯。本文結合程序在線評測系統,針對程序設計課程的C/C++程序代碼不規(guī)范問題提出了一種基于在正則表達式和編輯距離的檢測方法并通過實驗驗證了不規(guī)范的代碼出現錯誤概率較大。
關鍵詞:軟件測試;代碼格式規(guī)范;程序在線評測系統
中圖分類號:G623.58 文獻標志碼:A 文章編號:1674-9324(2018)44-0154-02
一、引言
目前國內外的程序自動化調試研究中,在針對特定類型故障、數據結構及內存等方面取得了一定進展,但對由不良程序編程習慣或者編程代碼格式的不規(guī)范引起的錯誤類型研究還較少[1]。編程者往往在編程中只注重算法和正確性,卻忽略代碼規(guī)范性,消耗了軟件調試過程中大量的時間和成本[2]。本文結合作者所在學校的在線編程評測系統(Online Judge System,OJ)[3,4],分析系統數據庫中答題者提交的程序,針對其中由于代碼塊括號匹配不規(guī)范出錯的程序,進行錯誤程度計算,提出一種代碼不規(guī)范程度檢測方法。
二、代碼格式規(guī)范化的概念
就軟件開發(fā)的代碼編寫而言,每個開發(fā)者的編程水平、經驗和習慣都大不相同。本文對于程序代碼格式規(guī)范化的概念進行簡單梳理,歸納如下:
1.格式一:對齊與縮進。(1)①“{”位置的兩種風格:①“{”和“}”獨占一行,且位于同一列,與引用他們的語句左對齊,便于檢查配對情況;②“{”位于引用他語句之后,“}”與引用他的語句左對齊。(2)位于同一層“{”和“}”之內的代碼相對于引用他們的代碼縮進。(一般用4個空格的tab鍵縮進,不用空格縮進)。
2.格式二:代碼行內空格。(1)關鍵字之后加空格,關鍵字與操作符之間不加空格。(2)采用第一種“{ }”格式的函數名之后不加空格,采用第二種“{ }”格式的函數名之后加空格。(3)賦值、算術、關系、邏輯等二元運算符前后各加一空格,但是一元運算符前后一般不加空格。(4)“( )”中,變量之間緊跟“,”。(5)“,”,“;”后留一個空格。
3.格式三:代碼行。(1)一行只寫一條語句。(2)一行只寫一個變量。(3)每個關鍵字之間要加一個空格隔開。
三、代碼格式不規(guī)范化程度檢測方法
本文以OJ平臺學生所提交的所有代碼作為分析源,結合正則表達式及編輯距離的概念,使用Python對數據庫中的代碼計算相應的不規(guī)范程度。
1.正則表達式。本文設計的正則表達式如下。
(1)“.*? +”用該模式去掉多余的空格。(2)“[,!=<>\+\-\*\/]+[A-Za-z0-9]+|[A-Za-z0-9]+[,!=<>\+\-\*\/]+”用該模式添加標識符與運算符之間的空格。
2.編輯距離。編輯距離用來度量兩個字符串的相似度?;诰庉嬀嚯x算法進行動態(tài)編程,其算法的時間復雜度為O(m*n),空間復雜度為O(m*n),m,n分別表示源字符串S和目標字符串T的長度。編輯距離的動態(tài)規(guī)劃求解方程組如下所示。
四、實驗驗證
1.代碼格式不規(guī)范化錯誤統計及實例。本文針對目前OJ平臺數據庫中提交的135,556份C/C++程序(包含提交結果正確和錯誤的代碼),進行分析統計,計算全部代碼的不規(guī)范化程度,結果如圖1顯示。橫軸以規(guī)范代碼及不規(guī)范代碼之間的編輯距離作為劃分依據,縱軸是屬于此編輯距離的不規(guī)范代碼數量。從圖1我們可以發(fā)現,OJ平臺數據庫中,只有不到11,000份代碼做到規(guī)范化,當然如果把不規(guī)范程度在[1—20]之間的代碼看作規(guī)范的話,那么也只有不到46,000份代碼是規(guī)范的。
為了進一步分析不規(guī)范程度對于代碼的正確性影響,我們將OJ平臺數據庫中87,933份錯誤代碼進行單獨分析,圖2顯示了錯誤代碼中不同規(guī)范程度的代碼分布情況及占總錯誤代碼的百分比。
我們綜合比較圖1和圖2,可以觀察到,錯誤代碼中不規(guī)范代碼的比例與總代碼中不規(guī)范代碼的比例成正相關。
五、總結與展望
本文針對C/C++程序代碼不規(guī)范問題,提出了一種基于在線編程評測系統(OJ)的代碼規(guī)范化檢測方法框架,實驗驗證了該方法能夠有效度量代碼不規(guī)范錯誤程度,且代碼不規(guī)范是程序錯誤的重要原因。之后的工作,我們將進一步分析程序員的編程習慣,并著眼于Java、C#以及Python等更多程序語言的代碼不規(guī)范自動修復問題。
參考文獻:
[1]馬春燕,劉杰,賴文豫.基于變異技術的程序故障自動化修復方法[J].計算機應用研究,2014,31(1):177-181.
[2]王延青,王建政,張麗杰,等.程序設計語言教學中編碼標準的定量評測框架[J].合肥工業(yè)大學學報(社會科學版),2008,(6):67-71.
[3]李文新,郭煒.北京大學程序在線評測系統及其應用[J].吉林大學學報:信息科學版,2005,23(2):170-177.
[4]紀洪波.基于jQuery的Web源程序在線評測系統的設計與實現[D].吉林大學,2010.
Abstract:For inexperienced programmers,it costs lots of effort to debug and fix C/C++ program errors. When beginners get in touch with the simple programming problem,the solution methods are always correct. Due to their poor programming experiences and inadequate programming habit,the code formatting is incorrect,which leads to incorrect outputs. Motivated by the prospect of reducing human developer involvement,this paper proposed a detection method,especially for the code segment standardization,and applied this method to detect bugs of incorrect code formatting of C/C++ language programs.
Key words:software testing;code segment standardization;online judge system