Presentation is loading. Please wait.

Presentation is loading. Please wait.

객체 지향 프로그램(C++)을 위장한 절차식(C) 패러다임 자동 식별화 구축 (Constructing an Automatic system for identifying the facked Procedural-Oriented Paradigm(C) within Object-Oriented.

Similar presentations


Presentation on theme: "객체 지향 프로그램(C++)을 위장한 절차식(C) 패러다임 자동 식별화 구축 (Constructing an Automatic system for identifying the facked Procedural-Oriented Paradigm(C) within Object-Oriented."— Presentation transcript:

1 객체 지향 프로그램(C++)을 위장한 절차식(C) 패러다임 자동 식별화 구축 (Constructing an Automatic system for identifying the facked Procedural-Oriented Paradigm(C) within Object-Oriented Program(C++)) 홍익대학교 소프트웨어공학연구실 변 은 영

2 Contents I. 연구 배경 II. C++을 위장한 C패러다임 III. Tool-Chian 구성
V. 결론 & 향후 연구 III. Tool-Chian 구성 II. C++을 위장한 C패러다임 IV. C패러다임 추출 가시화 I. 연구 배경

3 SW 품질 연구 배경 SW 비가시성 중소기업 개발환경 SW 복잡도 증가 참조 : SW 개발 품질관리 매뉴얼, NIPA
품질에 대한 부분은 결과 테스트에 의존 개발 후반에 다양한 문제 발생 개발 전과정 상호 연관성 확보 필요 인력, 비용적 측면에서 어려움 존재 개발 환경의 특성상 개발 과정 전반을 특정 인원 및 조직이 파악하기 어려움 개발 진척 사항과 품질 수준 파악을 위한 방안 필요 대규모 SW요구 증가 문제 해결을 위해 체계적이고 정량적인 접근 방법 필요

4 연구 배경 SW Visualization Architecture UML Diagram 복잡도 메트릭 성능 저전력

5 Quality Improvement(C++)
연구 배경 <<기존 연구>> 객체 지향 언어인 C++ 의 복잡도 측정 기존 연구를 통해 리팩토링 하는 과정에서 C++을 C패러다임으로 프로그래밍한 부분의 복잡도가 높은 것을 확인 해당 부분의 리팩토링을 통해 복잡도 낮춤 Quality Improvement(C++) 프로그램 구조 파악 절차식(C) 패러다임 식별

6 C++을 위장한 C패러다임 Type 종류 C 패러다임 C++ 패러다임 Style Warning Performance
input/output printf(), scanf() std::cout, std::cin 메모리 할당 malloc(), calloc(), free() new, delete struct 사용자 정의 타입 ≠ 기본 데이터 타입 사용자 정의 타입 = 기본 데이터 타입 enum Warning cast (cast형) static_cast<cast형> reinterpret_cast<cast형> file(input/output) File fstream Performance namespace X O Boolean

7 C++을 위장한 C패러다임 – input/output
C++의 cout은 C언어의 printf와 달리 출력하는 대상의 데이터 타입을 서식문자 없이 자동으로 출력 C++의 cin은 C언어의 scanf와 달리 입력한 값을 저장할 변수의 서식문자 없이 변수형에 맞게 자동으로 저장 객체 지향 기능을 가지고 있기 때문에 연산자 오버로딩으로 가능 C 패러다임 C++ 패러다임 #include<stdio.h> class A{ void func(){ printf(“C paradigm”); printf(“printf function”); } #include<iostream> class A{ void func(){ std::cout << “C++ paradigm”; std::cout << “cout function”; } C 언어 처럼 .h확장자 사용하지 않음 (std::count , std::endl 함수 정의) 문자열 출력 함수 std::cout std – Standard / cout – Console Output

8 C++을 위장한 C패러다임 – 메모리 할당 C패러다임의 malloc함수는 필요한 메모리를 바이트 단위로 지정하고 void *를 리턴하므로 sizeof 연산자와 캐스트 연산자가 필요 C++패러다임의 new연산자는 할당할 타입을 지정하고 해당 타입의 포인터를 리턴하므로 간단하고 할당할 때 생성자가 자동으로 호출되어 초기값 설정이 가능 C 패러다임 C++ 패러다임 class A{ void func(){ int *i; i = (int*)malloc(sizeof(int)); free(i); } class A{ void func(){ int *i; i = new int; delete i; } 키워드 new 키워드 delete

9 C++을 위장한 C패러다임 – struct C패러다임의 struct는 사용자 정의 타입으로 선언한 이름만 쓰면 인식할 수 없으므로 struct 키워드를 붙이거나 typedef 키워드를 사용 C++패러다임의 struct는 사용자 정의 타입으로 기본 데이터 타입과 통합된 타입 시스템으로 인식 구조체 내의 초기화와 메소드 선언이 가능 C 패러다임 C++ 패러다임 struct String{ char *str; int len; }; class A{ void *new String(const char *str){ struct String *ret = 0; } void func(struct String *s){ struct String{ char *str = 0; int len = 0; void print(void){ using namespace std; cout << this->str << endl; }; class A{ void *new String(const char *str){ String *ret = 0; } void func(String *s){ 구조체 내에 초기화 메소드 선언 구조체 변수 생성 시 struct 생략

10 C++을 위장한 C패러다임 – enum C패러다임의 enum는 사용자 정의 타입으로 선언한 이름만 쓰면 인식할 수 없으므로 enum 키워드를 붙이거나 typedef 키워드를 사용 C++패러다임의 enum는 사용자 정의 타입으로 기본 데이터 타입과 통합된 타입 시스템으로 인식 C 패러다임 C++ 패러다임 enum state{ stop, plying, paused }; class A{ void func(void){ enum state bPlay; while(true){ if(bPlay == Playing){ … } else if(bPlay == paused){ … } else if(bPlay == stop){ … } } enum state{ stop, plying, paused }; class A{ void func(void){ state bPlay; while(true){ if(bPlay == Playing){ … } else if(bPlay == paused){ … } else if(bPlay == stop){ … } } 열거형 변수 생성 시 enum 생략

11 C++을 위장한 C패러다임 – cast C패러다임의 cast는 semantic에 따라 서로 다른 의미를 가지며 모두 단일 구문으로 쓰이는데 오류 없이 컴파일되더라도 런타임 시 오류 발생할 수 있음 C++패러다임의 cast는 cast의 모호함을 피하고 예상치 못한 오류를 피할 수 있음 C 패러다임 C++ 패러다임 extern void Fun(Derived*); class A{ void Gun(Base* pb){ Derived* pd = (Base*)pb; Fun(pd); } extern void Fun(Derived*); class A{ void Gun(Base* pb){ Derived* pd = static_cast<Derived*>pb; Fun(pd); } 키워드 static_cast – 형변환 키워드 reinterpret_cast – 선언 되지 않은 형변환

12 C++을 위장한 C패러다임 – namespace
C패러다임은 동일한 이름의 함수를 사용할 수 없기 때문에 namespace를 대체해서 식별할 수 있는 수식어를 붙여 사용 ex > aumoaPrintfInfo, libPrintInfo (대문자 구분) aumoa_PrintInfo, lib_PrintInfo (‘_’ 구분) C++패러다임의 namespace 키워드는 동일한 이름을 가진 함수들의 충돌 방지 C 패러다임 C++ 패러다임 class A{ void aumoaPrintInfo(void){ std::cout << “Made by Aumoa”; return; } void libPrintInfo(void){ std::cout << “Made by Lib”; class A{ namespace Aumoa{ void PrintInfo(void){ std::cout << “Made by Aumoa”; return; } namespace Lib{ std::cout << “Made by Lib”; 동일한 명칭의 function을 namespace를 통해 사용 가능 Aumoa::PrintInfo()형태로 호출

13 C++을 위장한 C패러다임 – Boolean
C패러다임은 Boolean 타입을 대체해서 int형 사용 C++패러다임의 Boolean 타입 추가 C 패러다임 C++ 패러다임 class A{ int func(void){ int condition = 0; while(condition){ } return; class A{ int func(void){ bool condition = true; while(condition){ } return; int 형이 아닌 Boolean타입을 사용해 프로그램 구조 상에서 개발자의 이해를 도움

14 Tool-chain 구성도 Step1

15 Step1 – 코드 입력 Source Code xCodeParser *.c / *.cpp
입력된 소스 코드 정보를 분석한 결과로 ASTM을 추출

16 Step1 – 코드 입력 기존 Parser xCodeParser
하나의 언어로 만들어진 소프트웨어는 다른 언어 기반의 플랫폼에서 재사용이 어려움 언어 별로 Parser가 따로 존재 이종 언어들 간의 코드 변환이 어려움 Complecate Java Parser java Java AST C/C++ Parser C/C++ C/C++ AST others others Parser others AST xCodeParser 이종 코드로 변환 가능 정보의 손실이 없는 새로운 모델 변환 언어 ASTM ASTM은 언어마다 다른 AST에 대한 통합 모델 Simple java C/C++ xCodeParser ASTM others

17 Tool-chain 구성도 Step2

18 Step2 – 소스 분석 *.astm xCodeParser xCodeParser를 이용해 소스 코드 분석

19 preprocessor Elements
Step2 – 소스 분석 path, language comment, macro, include type startLine, startPosition, endLine, endPosition nameString project fragment preprocessor Elements locationInfo aggregateType member files typeName accessKind storagetSpecifiers identifierName returnType

20 Step2 – 소스 분석 Source Code ASTM 주석 클래스 선언 메소드 선언 20
<?xml version="1.0" encoding="UTF-8"?> <sastm:SASTModel xmi:version="2.0" xmlns:xmi=“.." xmlns:xsi=“.." xmlns:gastm=“.."> <project> <files path="C:\Users\...\RobotModelingSimulation\AutocomplectionCtrl.h" language=“C/C++"> <preProcessorElements xsi:type="gastm:Comment" body="// AutocomplectionCtrl.h : header file"> <locationInfo startLine="7" startPosition="134" endLine="7„endPosition="172"> <inSourceFile path="C:\Users\...\AutocomplectionCtrl.h"/> </locationInfo> </preProcessorElements> …. <fragments xsi:type="gastm:AggregateTypeDefinition"> <locationInfo startLine="10" startPosition="180" endLine="40" endPosition="974"> <typeName nameString=“CLineNumberStatic"/> <aggregateType xsi:type="gastm:ClassType"> <members> <member xsi:type="gastm:FunctionDefinition"> <locationInfo ….> <storageSpecifiers xsi:type=“gastm:NoDef”> <accessKind xsi:type="gastm:Public"/> <identifierName nameString=“CLineNumberStatic"/> <returnType xsi:type="gastm:UnnamedTypeReference"> </member> </members> </aggregateType> </fragments> <opensScope/> </files> 주석 클래스 선언 메소드 선언 20

21 Step2 – 소스 분석 ❶ ❷ Source Code ASTM 메소드 호출 참조 호출 메소드 변수명 변수 선언 변수 타입
<members> <member xsi:type="gastm:FunctionDefinition"> <storageSpecifiers xsi:type="NoDef"/> <accessKind xsi:type="gastm:Public"/> <identifierName nameString=“CAutocomplectionCtrl::OnListBoxChanged"/> <returnType xsi:type="gastm:UnnamedTypeReference"> <type xsi:type="gastm:Void"/> </returnType> <body xsi:type="gastm:BlockStatement"> <subStatements xsi:type="gastm:DeclarationOrDefinitionStatement"> <declOrDefn xsi:type="gastm:VariableDefinition"> <identifierName nameString=“temp"/> <definitionType xsi:type="gastm:NamedTypeReference"> <typeName nameString="CString"/> </definitionType> </declOrDefn> </subStatements> <subStatements xsi:type=“gastm:ExpressionStatement”> <expression xsi:type=“gastm:FunctionCallExpression”> <calledFunction xsi:type=“gastm:QualifiedOverData”> <qualifiers xsi:type=“gastm:IdentifierReference”> <identifierName nameString = “m_listbox”/> </qualifiers> <member> <identifierName nameString=“GetText”/> </member> </calledFunction> <actualParams xsi:type=“gastm:ActualParameterExpression”> <value xsi:type=“gastm:FunctionCallExpression”> </actualParams> <value xsi:type=“gastm:IdentifierReference”> <identifierName nameString=“temp”/> </expression> </subStatmeents> 메소드 호출 참조 호출 메소드 변수명 변수 선언 변수 타입 파라미터

22 Tool-chain 구성도 Step3

23 Step3 – DB 저장 *.astm SQLite Step2에서 분석한 정보인 ASTM데이터를 원하는 구조로 구조화하여 저장
ASTM_contents file_name class_type class_acceses class_name parent_class_name mem_type mem_acceses mem_name mem_initial def_type scope start_line end_line par_name ASTM_local file_name class_name func_name mem_type mem_acceses mem_static mem_name mem_initial def_type scope start_line end_line *.astm SQLite ASTM_contents ASTM_API ASTM_link file_name class_name mem_name mem_initial start_line end_line call_name call_type CCheck ASTM_local ASTM_link Step2에서 분석한 정보인 ASTM데이터를 원하는 구조로 구조화하여 저장 ASTM_API, CCheck 테이블은 기존 데이터를 분석해 재구성

24 Step3 – DB 저장 변수 선언(variable) 테이블 : ASTM_contents … … 메소드 선언
(function)

25 Step3 – DB 저장 테이블 : ASTM_local 지역 변수 테이블 : ASTM_link …
객체 생성 메소드 호출(function)

26 Tool-chain 구성도 Step4

27 Step4 – 구조 분석 SQLite DOT DotScript
ASTM_contents ASTM_API CCheck ASTM_local ASTM_link 구조 분석 단계는 미리 정의된 절차식(C) 패러다임 정의에 따라서 데이터베이스에 저장된 정보를 DOT 문법에 맞게 재해석 데이터베이스 정보를 재해석 하기 위해 Query 문을 사용

28 Step4 – 구조 분석 Query – 노드 가시화
파일 단위로 서브 그래프를 만들고 노드(class, struct, cpp)를 가시화 : Select distinct file_name from ASTM_contents : Select distinct class_type, class_name, mem_type, mem_name from ASTM_contents where file_name = ‘file_name’ and (mem_type=‘variable’ or mem_type =‘function’) and (class_type=‘’ or class_type=‘class’ or class_type=‘struct’) digraph xx { compound=true; subgraph "clusterdrawstuff.h“{ label = "drawstuff.h" color = blue fontsize = 20 rank="same“ "drawstuff.h" [shape=none label = <<table border="0" cellspacing="2“ <tr><td port="drawstuff.h" border="1" bgcolor = "#cd96cd">drawstuff.h</td></tr> <tr><td port="drawstuff.h_DS_TEXTURE_NUMBER" border="1“ bgcolor="mintcream">DS_TEXTURE_NUMBER</td></tr> <tr><td port="drawstuff.h_use_textures" border="1" bgcolor="mintcream">use_textures</td></tr> …. <tr><td port="drawstuff.h_dsError" border="1" bgcolor ="mistyrose">dsError</td></tr> <tr><td port="drawstuff.h_dsDebug" border="1" bgcolor ="mistyrose">dsDebug</td></tr> ... </table>> ] "Image" [shape=none label = <<table border="0" cellspacing="2"> } file variable 전역 변수 메소드 method 클래스

29 Step4 – 구조 분석 Query – call 관계 가시화
: Select distinct ASTM_link.file_name, ASTM_contents.file_name, ASTM_contents.class_name, ASTM_link.mem_name, ASTM_link.call_name, call_type, ASTM_contents.par_type, mem_acceses, control_count, goto_count, ASTM_link.static from ASTM_link, ASTM_contents where ASTM_link.call_name = ASTM_contents.mem_name and call_type='function' digraph xx { compound=true; edge [arrowhead = "empty"] "CSizingControlBar"->"baseCSizingControlBar“ edge [arrowhead = "empty"] "CSplashLogo"->"CDialogEx“ edge [arrowhead = "empty"] "CViewTree"->"CTreeCtrl“ "atmosphere.cpp"->"Lib3dsChunk"[style=dotted color=navy] edge [arrowhead = "vee"]"atmosphere.cpp"->"io.cpp“ edge [arrowhead = "vee"]"atmosphere.cpp"->“chunk.cpp“ } 상속 관계 호출 관계 객체 생성 관계

30 Tool-chain 구성도 Step5

31 Step5 – 가시화 가시화 단계는 step4에서 재해석한 정보를 DOT Gen(Graphviz)를 이용해 가시화 DOT Graph DotScript Graphviz

32 IV. C패러다임 추출 가시화 subgraph(*.h / *.cpp) class struct cpp variable
fuction 상속 관계 호출 관계 객체 생성 관계 C++ 프로그램의 모든 Class, Struct, cpp를 노드로 표현(색깔로 구분) 각 노드의 포함되는 Variable, Method 입력(색깔로 구분) 상속 관계(검정), 객체 생성 관계(파란 점선) 표현

33 IV. C패러다임 추출 가시화 - RobotModelingSimulation
사용된 API 표현 C패러다임에 해당하는 Variable이나 Method는 빨간색으로 구분

34 IV. C패러다임 추출 가시화 - RobotModelingSimulation
어떤 C패러다임이 발견되었는지는 CCheck 테이블 Ccheck 테이블 데이터 실제 가시화 결과

35 V. 결론 & 향후 연구 소프트웨어 규모가 점점 커지고 복잡해지면서 SW품질 중요성 증가
객체 지향 프로그램(C++)에서는 절차식(C) 패러다임이 프로그램의 복잡도를 높이는 원인 객체 지향 프로그램을 위장한 절차식 패러다임을 정의하고 이를 식별하는 Tool-Chain 개발 프로그램 구조와 객체 지향 프로그램을 위장한 절차식 패러다임 가시화 가시화 결과에 따라 객체 지향 프로그램을 위장한 절차식 패러다임 판단 SW품질을 위해 리팩토링이 가능 향후 연구 객체 지향 프로그램을 위장한 절차식 패러다임 추가적으로 검출 자동으로 리팩토링이 수행되는 시스템 구현

36 Q & A


Download ppt "객체 지향 프로그램(C++)을 위장한 절차식(C) 패러다임 자동 식별화 구축 (Constructing an Automatic system for identifying the facked Procedural-Oriented Paradigm(C) within Object-Oriented."

Similar presentations


Ads by Google