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

Slides:



Advertisements
Similar presentations
Made by 주례 없는 결혼식♥ 대본 사회 : 홍길동.
Advertisements

Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
온누리교회 일대일 사역팀. CONTENTS 1. 예수님의 공생애 사역 2. 죄의 기원과 죄의 결과 3. 죄 문제의 해결 I. 예수님의 부활은 그리스도의 죽음과 함께 기독교 II. 인간은 하나님 앞에 모두 죄인이다. III. 따라서 나도 죄인이라는 사실을 깨달아야 한다.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 01. C 언어 기반의 C++ 1.
3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
Vision System Lab, Sang-Hun Han
명품 C++ 8장 상속.
Lamda on AVR C/C++ 최신 표준과 임베디드의 접목.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express Slide 1 (of 34)
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
강좌명 : C++프로그래밍 (C++ Programming)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
8. 객체와 클래스 (기본).
Internet Computing KUT Youn-Hee Han
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
C++ Espresso 제9장 다형성.
10장 객체-지향 프로그래밍 II ©창병모.
제 1 장 C 언어의 개요 Google 공동 창업자, 래리 페이지와 세르게이 브린.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
DataScience Lab. 박사과정 김희찬 (월)
C ++ 프로그래밍 시작.
Chapter 1 C++ 기초 Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
ㅇ 스프링 설정파일 (dispatcher-servlet.xml)
2011년 하반기 VIP투자자문 인재채용 안내
adopted from KNK C Programming : A Modern Approach
Chapter 2 Lexical Elements, Operators, and the C System
DataScience Lab. 박사과정 김희찬 (월)
OpenCV 설치 및 구성 OpenCV
자바의 신 Volume 1 1부(1~3장) 자바의 신 메인 홈 : 자바의 신 페이스북: 자바의 신 문제 풀이 :
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
강의 소개, 자료구조의 개념, SW 개발과 자료구조
타입, 연산자 Chapter 5, 6 Kum Deuk Kyu , Ph. D. Spring 2015
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
처음으로 배우는 C 프로그래밍 제3부 함수 제 6 장 함수 작성.
루프와 카운트 Looping and counting
문자열 처리하기 working with Strings
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
5. 논리적 자료표현 : 구조체.
객체지향 패러다임에서의 코드 재사용을 위한 응집도 레벨 식별 모범 사례
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
이번 시간에는... 지난 시간까지 2회차에 걸쳐 WML의 택스트 포맷, 이미지 처리, 페이지 이동, 태스크 수행과 이벤트 처리 및 WML 사용자 Input 처리 태그 등, WML 개발에 대해서 알아보았습니다. 이번 시간에는 2회차에 걸쳐, WML 스크립트 개발에 대해서.
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
C.
C++ 언어의 특징
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
Python 기본.
Presentation transcript:

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

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

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

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

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

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

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

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

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 생략

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 생략

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 – 선언 되지 않은 형변환

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()형태로 호출

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타입을 사용해 프로그램 구조 상에서 개발자의 이해를 도움

Tool-chain 구성도 Step1

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

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

Tool-chain 구성도 Step2

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

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

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

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> 메소드 호출 참조 호출 메소드 ❶ 변수명 변수 선언 변수 타입 ❷ 파라미터

Tool-chain 구성도 Step3

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 테이블은 기존 데이터를 분석해 재구성

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

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

Tool-chain 구성도 Step4

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

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 클래스

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“ } 상속 관계 호출 관계 객체 생성 관계

Tool-chain 구성도 Step5

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

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

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

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

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

Q & A