순환복잡도분석 SW 가이드 - 안전성확보를위한순환복잡도관리 - 소프트웨어안전성보증연구센터
제출문 본보고서를대학 ICT 연구센터육성산업 ( 사업기간 :2015. 6.1.~2018. 12. 31) 의 과제인 소프트웨어안전성보증을위한정확성확보체계개발 에대한 2 차년도별첨보고서로제출합니다. 2016. 12. 16. 연구책임자 : 교 수 한혁수 ( 상명대학교컴퓨터과학과 ) 참여연구원 : 연구원 한동준 ( 소프트웨어안전성보증연구센터 ) 학생연구원 김은비 ( 상명대학교컴퓨터과학과 ) 오승원 ( 상명대학교컴퓨터과학과 ) 최이수 ( 상명대학교컴퓨터과학과 )
목 차 제 1 장순환복잡도분석 SW 가이드개요 3 제 1 절도구필요성 3 제 2 절도구개요 3 제 2 장도구설치및기본설정 4 제 1 절사전조건 4 제 2 절도구다운로드및설치 4 제 3 장명령줄실행 5 제1절기본실행방법 5 제2절실행및기본결과확인 6 제3절상세결과확인 8 제 4 장 Jenkins 연동및실행 10 제1절 Jenkins의플러그인설치및설정 10 제2절 Jenkins Job 설정 11 제3절 Jenkins 실행결과확인 12-2 -
제 1 절도구필요성 제 1 장순환복잡도분석 SW 가이드개요 안전성이중요시되는소프트웨어는소스코드로직상에서이상을발생시킬수있는원인을최대한제거하고, 테스트시 Line, Branch, MC/DC 커버리지를최대로달성해야함 이를위해서는소스코드의순환복잡도가낮아야하며, ISO 26262 등안전성관련국제표준에서도요건으로서낮은순환복잡도를제시하고있음 높은순환복잡도는소스코드에대한테스트를어렵게만들고, 개발자의이해도를떨어뜨려결과적으로기능안전성을저해함 NSIQCollector는프로그래밍언어와무관하게함수 / 메소드단위의순환복잡도를분석하고결과를표현함 제 2 절도구개요 NSIQCollector는 NHN에서개발한오픈소스분석도구로써, CodeAnalyzerPro를내부적으로호출하고, 그결과를표시함 명령줄에서실행가능하며, Jenkins 플러그인을통해 Jenkins 빌드시분석하고결과및추세를그래프로표시함 NSIQCollector가제공하는기능은다음과같음 지정한디렉토리하위에있는코드를대상으로한번의명령어실행으로다양한언어에대해 LOC 정보와복잡도정보추출 지정한디렉토리중필요없는하위디렉토리내의코드정보를필터링가능 초기파일리스트를지정하여, 변경 / 신규생성된코드만측정수행가능 Windows / Linux 지원 CSV / HTML / EXCEL / XML 로분석결과출력 NSIQCollector를이용하여소스코드에서추출가능한정보는다음과같음 소스코드파일개수 (C/C++, Java, JSP, PHP, Javascript, HTML 코드파일대상 ) 소스코드총 LOC (Lines of Code) 소스코드의코드 LOC ( 커멘트로만구성된라인과빈줄을제거한나머지줄수 ) 총함수의개수 (C/C++, Java 코드파일대상 ) 각함수의총 LOC / 코드 LOC / Cyclomatic Complexity 총함수중 Cyclomatic Complexity가 10 이상인함수개수및비율 총함수중 Cyclomatic Complexity가 30 이상인함수개수및비율 - 3 -
제 2 장도구설치및기본설정 제 1 절사전조건 본도구를실행하기에앞서 Java 가설치되고, 실행설정이되어있어야함 Java 는 1.5 버전이상이설치되어야함. Java 관련다음항목이설정되어야함 1. 시스템환경변수 JAVA_HOME: Java 설치폴더 2. Path Java bin 폴더 제 2 절도구다운로드및설치 NSIQCollector 는공식페이지에서관련정보및다운로드링크를확인할수있음 공식페이지 URL 은다음과같으며, 네이버개발자센터내에위치함 http://dev.naver.com/projects/nsiqcollector 최신버전은 2.1.4이며, Windows 용과 Linux 용으로구분하여제공함 다운로드가완료되면별도의설치과정없이압축해제하고사용가능하며, 소스코드가위치한폴더에서실행하려면실행파일인 nsiqcollector.exe가위치한폴더를시스템 path에등록하는것이좋음 실행파일폴더의예 ) C:\nsiqcollector - 4 -
제 3 장명령줄실행 제 1 절기본실행방법 NSIQCollector 의실행방법과옵션을확인하는방법은실행파일에 h 옵션을함 께실행하는것임 NSIQCollector 에서제공하는기본실행옵션은다음과같음 nsiqcollector -h Usage : nsiqcollector [-c complexityresultfile] [-l locresultfile] [-f filefilterlcoation] [-d] [-i] [-g] [--html --csv] [--force-lang=languagename:extension,[languagename:extension]] targetdirectory.. [Example] nsiqcollector. nsiqcollector -g. nsiqcollector --html target nsiqcollector -c comresult.html -l locresult.html --html target target2 nsiqcollector --force-lang=jsp/php:xml target [Options] -c Assign complexity anlysis result file location (optional when 1 target is provided) -l Assign loc analysis result file location. (optional when 1 target is provided) --html Output HTML format (default) --csv Output HTML format (if not provided, the default output type(html) is used) -g Generate the basefilelist.txt file. This file contains the current source file name and size, so that it can be used to get the file information which is modified. -i CI(Continuous integration) mode. it excludes '\\target\' directory, doesn't make filefilter.txt even when it's not available, and print analysis starting and end time. -f filefilter location -d Leave the temporary files for debugging purpose. -v Show detail ouput(verbose mode) --force-lang=languagename:extension,[languagename:extension]... Add file extensions to be counted as assigned languages. -s Assign Filter scope name to be applied in this analysis -m MODULENAME Assign Ouput Module to enable custom ouput - 5 -
NSIQCollector 를실행하는가장쉬운방법은명령어와분석대상폴더를지정하 는것으로예제는다음과같음 nsiqcollector 분석대상폴더 만약현재폴더를분석함이면실행방법은다음과같음 nsiqcollector. 분석결과는기본적으로순환복잡도와 LOC 로구분하여 html 파일로저장됨 그러나 CSV 또는 EXCEL 로출력하려면다음의옵션을붙일수있음 --csv / --excel 제 2 절실행및기본결과확인 앞절에서실행방법은살펴보았으며, NSIQCollectr의소스코드에서 Trunk 폴더를대상으로분석을실행하고자함 실행방법은 trunk의상위폴더에서 trunk 폴더를대상으로실행했음. 실행명령은다음과같음 nsiqcollector trunk 위의명령을실행하면화면에다음과같은내용이출력됨 ============================ Analyzing nsiqcollector =============================== Filter Scope "default" is applied. Current Filter Setting (Following is applied sequentially) \.cvs\ is excluded \.svn\ is excluded Current File extension and Language Settings JSP/PHP=tpl,nhn,NHN,jsp,php, C/C++=cpp,cxx,c,h,hxx,hpp, Html=htm,html, Java=java, JavaScript/ActionScript=as,js, - 6 -
============================= Summary Report ============================== Product LOC - only apply filefilter.txt ** Total File Count : 84 ** Total LOC : 9109 ** Total Code LOC : 6669 Delta LOC - apply both filefilter.txt and basefilelist.txt ** Total File Count : 84 ** Total LOC : 9109 ** Total Code LOC : 6669 Delta Complexity - apply both filefilter.txt and basefilelist.txt ** Total Delta Function Count : 480 ** Delta Over 10 Complexity Function Rate: 14 (2.92%) ** Delta Over 30 Complexity Function Rate: 3 (0.63%) LOC Distribution Per Lang Lang Java C/C++ Html JSP/PHP JavaScript... Product File Count 70 3 3 4 4 LOC 6353 500 1471 174 611 Code LOC 4724 381 1068 153 343 Delta File Count 70 3 3 4 4 LOC 6353 500 1471 174 611 Code LOC 4724 381 1068 153 343 Loc analysis report is saved in nsiqcollector\loc_result.html Complexity analysis report is saved in nsiqcollector\complexity_result.html 이실행결과로 2 개의 html 문서에전체결과가출력되며, 명령줄에서는전반적 인결과가표시됨 위의결과는다음과같은내용을포함하고있음 전체분석대상파일 : 84 개 - 7 -
전체 LOC: 9109 코드 LOC: 6669 총함수수 : 480개 순환복잡도 10 이상함수 : 14개 ( 전체함수의 2.92%) 순환복잡도 30 이상함수 : 3개 ( 전체함수의 0.63%) 분석대상폴더의 loc_result.html 와 complexity_result.html 에 LOC와순환복잡도상세분석결과를저장 제 3 절상세결과확인 1. loc_result.html 결과확인 상세결과중, loc_result.html 은다음과같이결과가표시됨 예제는앞절과동일한 NSIQCollector 소스코드임 ( 그림 1) NSIQCollector 소스코드 - 8 -
위결과는다음의내용을포함하고있음 분석일시 전체 LOC 정보 각파일별전체 LOC 정보 각파일별코드 LOC 정보 2. complexity_result.html 결과확인 complexity_result.html 은다음과같이결과가표시됨 ( 그림 2) complexity_result.html 위결과는다음의내용을포함하고있음 분석일시 전체순환복잡도정보 각함수별전체 / 코드 LOC 정보 각함수별순환복잡도정보 - 9 -
제 4 장 Jenkins 연동및실행 NSIQCollector 는명령줄실행으로도순환복잡도에대한정보를제공하지만, Jenkins 와연동하여실행하면각빌드별추세, 상위폴더부터하위폴더로의 Deep Dive 분석이가능함 제 1 절 Jenkins 의플러그인설치및설정 Jenkins에서 NSIQCollector를실행하기위해서는 Jenkins가설치된서버에 NSIQCollector가설치되고기본설정이완료되어야함 Jenkins의 NSIQCollector 플러그인은 [Jenkins 관리 ]-[ 플러그인관리 ] 에서설치할수있으며, Jenkins의 NSIQCollector 플러그인정보는다음과같음 ( 그림 3) Jenkins 의 NSIQCollector 플러그인정보 - 10 -
설치가완료되면 [Jenkins 관리 ] - [ 시스템설정 ] 에 NSIQCollector 관련항목이생성되며, 다음과같이실행위치를실행파일명까지포함하여지정해줘야함 NSIQCollector가설치된위치가 C:\dev_tools\nsiqcollector\nsiqcollector.exe 라면설정은다음과같음 제 2 절 Jenkins Job 설정 Jenkins 에서 Job 을설정할때, NSIQCollector 실행여부 / 대상폴더와결과표시를 지정해야함. NSIQCollector 실행여부및대상폴더설정은다음과같음 ( 그림 4) NSIQCollector 실행여부및대상폴더설정 설정에. 인이유는, 체크아웃한폴더를대상으로분석하겠다는의미임 특정폴더를지정하려면, 해당폴더명을입력하면됨 NSIQCollector 결과표시지정은다음과같으며, 결과표시여부는 빌드후조치 에서추가할수있음 ( 그림 5) 빌드후조치 - 11 -
제 3 절 Jenkins 실행결과확인 NSIQCollector를 Jenkins에서실행하면다음과같이실행결과가표시됨 다만, Jenkins에서실행하면 NSIQCollector의기본설정외에, html 등의파일도분석하므로 loc의차이가남이부분은 NSIQCollector의설정파일을조정함으로써해결가능함 Job의메인화면에는다음과같이표시됨 ( 그림 6) Job 의메인화면 Main 화면에표시되는항목은다음과같음 일별 LOC 추세그래프 마지막빌드의파일별 LOC 그래프 순환복잡도추세그래프 각빌드에서는 Complexity Breakdown by Directory 표가추가로표시됨이표는분석대상의최상위폴더가표시되며, 각폴더를클릭하면하위폴더로이동하며결과를표시함 각폴더내의파일을클릭하면폴더에속한메서드 / 함수의순환복잡도와 LOC 정보를확인할수있음기준순환복잡도인 10, 30 이상인메서드 / 함수가포함되면각각노란색, 빨간색으로강조되어기준이상의항목을쉽게확인할수있음 - 12 -
( 그림 7) 폴더에속한메서드 / 함수의순환복잡도와 LOC 정보 파일을선택하여소속메서드 / 함수의결과를확인하면다음과같음 ( 그림 8) 파일의소속메서드 / 함수의결과 - 13 -