杜彬 賀杰 徐陽 王林鑫 尤楓



摘要:針對程序初學者編寫的C/C++程序,調試需要消耗大量的時間和精力。然而,初學者在接觸簡單的編程時,編寫思路一般不存在問題,但由于其良好的編程習慣還未養成,代碼格式往往不規范,從而導致程序相應代碼塊出錯。本文結合程序在線評測系統,針對程序設計課程的C/C++程序代碼不規范問題提出了一種基于在正則表達式和編輯距離的檢測方法并通過實驗驗證了不規范的代碼出現錯誤概率較大。
關鍵詞:軟件測試;代碼格式規范;程序在線評測系統
中圖分類號:G623.58 文獻標志碼:A 文章編號:1674-9324(2018)44-0154-02
一、引言
目前國內外的程序自動化調試研究中,在針對特定類型故障、數據結構及內存等方面取得了一定進展,但對由不良程序編程習慣或者編程代碼格式的不規范引起的錯誤類型研究還較少[1]。編程者往往在編程中只注重算法和正確性,卻忽略代碼規范性,消耗了軟件調試過程中大量的時間和成本[2]。本文結合作者所在學校的在線編程評測系統(Online Judge System,OJ)[3,4],分析系統數據庫中答題者提交的程序,針對其中由于代碼塊括號匹配不規范出錯的程序,進行錯誤程度計算,提出一種代碼不規范程度檢測方法。
二、代碼格式規范化的概念
就軟件開發的代碼編寫而言,每個開發者的編程水平、經驗和習慣都大不相同。本文對于程序代碼格式規范化的概念進行簡單梳理,歸納如下:
1.格式一:對齊與縮進。(1)①“{”位置的兩種風格:①“{”和“}”獨占一行,且位于同一列,與引用他們的語句左對齊,便于檢查配對情況;②“{”位于引用他語句之后,“}”與引用他的語句左對齊。(2)位于同一層“{”和“}”之內的代碼相對于引用他們的代碼縮進。(一般用4個空格的tab鍵縮進,不用空格縮進)。
2.格式二:代碼行內空格。(1)關鍵字之后加空格,關鍵字與操作符之間不加空格。(2)采用第一種“{ }”格式的函數名之后不加空格,采用第二種“{ }”格式的函數名之后加空格。(3)賦值、算術、關系、邏輯等二元運算符前后各加一空格,但是一元運算符前后一般不加空格。(4)“( )”中,變量之間緊跟“,”。(5)“,”,“;”后留一個空格。
3.格式三:代碼行。(1)一行只寫一條語句。(2)一行只寫一個變量。(3)每個關鍵字之間要加一個空格隔開。
三、代碼格式不規范化程度檢測方法
本文以OJ平臺學生所提交的所有代碼作為分析源,結合正則表達式及編輯距離的概念,使用Python對數據庫中的代碼計算相應的不規范程度。
1.正則表達式。本文設計的正則表達式如下。
(1)“.*? +”用該模式去掉多余的空格。(2)“[,!=<>\+\-\*\/]+[A-Za-z0-9]+|[A-Za-z0-9]+[,!=<>\+\-\*\/]+”用該模式添加標識符與運算符之間的空格。
2.編輯距離。編輯距離用來度量兩個字符串的相似度?;诰庉嬀嚯x算法進行動態編程,其算法的時間復雜度為O(m*n),空間復雜度為O(m*n),m,n分別表示源字符串S和目標字符串T的長度。編輯距離的動態規劃求解方程組如下所示。
四、實驗驗證
1.代碼格式不規范化錯誤統計及實例。本文針對目前OJ平臺數據庫中提交的135,556份C/C++程序(包含提交結果正確和錯誤的代碼),進行分析統計,計算全部代碼的不規范化程度,結果如圖1顯示。橫軸以規范代碼及不規范代碼之間的編輯距離作為劃分依據,縱軸是屬于此編輯距離的不規范代碼數量。從圖1我們可以發現,OJ平臺數據庫中,只有不到11,000份代碼做到規范化,當然如果把不規范程度在[1—20]之間的代碼看作規范的話,那么也只有不到46,000份代碼是規范的。
為了進一步分析不規范程度對于代碼的正確性影響,我們將OJ平臺數據庫中87,933份錯誤代碼進行單獨分析,圖2顯示了錯誤代碼中不同規范程度的代碼分布情況及占總錯誤代碼的百分比。
我們綜合比較圖1和圖2,可以觀察到,錯誤代碼中不規范代碼的比例與總代碼中不規范代碼的比例成正相關。
五、總結與展望
本文針對C/C++程序代碼不規范問題,提出了一種基于在線編程評測系統(OJ)的代碼規范化檢測方法框架,實驗驗證了該方法能夠有效度量代碼不規范錯誤程度,且代碼不規范是程序錯誤的重要原因。之后的工作,我們將進一步分析程序員的編程習慣,并著眼于Java、C#以及Python等更多程序語言的代碼不規范自動修復問題。
參考文獻:
[1]馬春燕,劉杰,賴文豫.基于變異技術的程序故障自動化修復方法[J].計算機應用研究,2014,31(1):177-181.
[2]王延青,王建政,張麗杰,等.程序設計語言教學中編碼標準的定量評測框架[J].合肥工業大學學報(社會科學版),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