목차 I. 배경 ASQ(Automated Software Quality) II. A-max 개요구조주요기능특징및기대효과사용자환경상세기능지원환경 III. 적용사례적용사례유형별진단결과요약적용시스템구조 2
I. 배경 3
1. ASQ(Automated Software Quality) 모든소프트웨어는최소한의결함요소를항상내포하고있다. 개발이후발생하는결함의수정및제거비용은단계를거칠수록기하급수적으로증가한다. 100X Application In the Field 15X System/Acceptance Testing 65X 6.5X 1 X Static Analysis Integration Testing Design Development Testing Deployment Source IDC and IBM Systems Sciences Institute 4
1. ASQ(Automated Software Quality) - 계속 Average Cost 일반적인 Large Application 에서는약 5,000 개의결함요소존재 QA 를통해서는약 4,000 개 (80%) 의결함요소발견 QA 를배제한개발에서는약 3,000 개 (60%) 의결함요소발견 5
1. ASQ(Automated Software Quality) - 계속 6
II. A-max 7
1. 개요 A-max Source code 의논리적오류에대한검사 A-max S.A. (Source Analyzer) 코드내에서사용된리소스, 트랜잭션및 SQL 정보에대한검사및보고 미들웨어 API 사용에대한검사및보고 Reliability 와 performance 향상을위한정보및통계자료제공 Framework 과연동하기위한분석방법지원 기정의된코딩표준및규칙에위배되는코드에대해서검사 A-max R.C. (Rule Checker) 기본적인코딩표준사항제공및사용자정의코딩표준정책수립및적용 코드내에서선언및사용된모든유형에대하여검사및보고 결과에대해서다양한방법으로보고 (Display, File -.xml,.txt,.xls, etc.) 8
2. 구조 Defect Report Repository 100.00% 99.00% 98.00% 97.00% 96.00% 95.00% 94.00% 93.00% 92.00% 91.00% 90.00% 1 차 2 차 3 차 4 차 Statistics Report 9
2. 구조 계속 Build Command Back End Data Preparer Syntax Analyzer Path Builder Semantics Analyzer Reporter Front End Analysis Report 10
3. 주요기능 정적코드분석 자원의누수검사 (Memory, File, Database, Cursor, etc.) 소스코드상의정확한결점위치보고 Unreachable Code 사용검사 소스코드의변경없이분석 Embedded SQL 사용시의트랜잭션의명시적사용검사 코드에서사용된 SQL 문장에대한메타데이터보고 미들웨어사용시의 TP/XA 사용모드검사 모듈별 In-Depth Analysis 지원 표준스타일분석 금지함수의사용여부검사 파일명및함수명의명명규칙준수여부검사 매크로및구조체선언시의명명규칙준수여부검사 사용자가정의한코딩표준에대한검사지원 경고레벨및수준에대한사용자정의지원 11
4. 특징및기대효과 특 징 1. 개발자관리자모두를위한솔루션 개발자는컴파일과정에서자신의소스코드에대한검증 관리자는해당소스코드를이용한애플리케이션적용시발생가능오류에대한점검 2. 소스코드만으로오류분석가능 별도의추가적인작업없이개발자가작성한소스코드만으로표준검사및오류검사작업진행 분석결과에대해서는다양한방법 (Display, File -.xml,.txt,.xls, etc.) 을통하여보고 3. 통합적인분석가능 모듈및여타관련정보를포함하는통합적인분석가능 Framework 과연동된기능에대한추가적인정보제공을통하여분석 4. 기존의관리솔루션과의연계가능 기존의형상관리, 영향분석및여타관리솔루션과의연계방안지원 12
4. 특징및기대효과 - 계속 기대 효과 소스코드의표준화 1. 소스코드작성의표준화정책의수립을통하여일관된소스코드의작성 2. 가독성을높이고, 향후수정및보완작업시효율적인작업이가능 시스템안정성 1. 소스코드레벨에서위험요소제거를통한애플리케이션의안정성확보 2. 안정된애플리케이션의운영을통한시스템안정성도모 개발속도향상 1. 오류발견에필요한시간및인력에대한절감을통하여개발속도향상 2. 가독성높은소스코드를통한수정및보완작업용이 중앙집중적관리 1. 소스코드에대한일관화된관리및현황관리용이 품질향상및유지관리 1. 소스레벨에서의오류가능성대처를통한애플리케이션의품질향상기여 2. 향후애플리케이션의업그레이드시소스코드에대한수정및변경용이 13
5. 사용자환경 GUI 및 Command Line Interface 를이용한개발자및관리자를위한다양한사용방법제공 Compiling-Time 정도의분석시간으로써분석및결과제공가능 분석된소스에대한통합적인관리및분석통계자료제공을통하여일관된관리방법제공 14
5. 사용자환경 - 계속 대상에대한분석결과와 DB 및 Queries 사용정보와같은부가적인정보에대해서구분하여리포팅 분석결과의 GUI 결과로써함수의종속성관계에대해서도식화하여리포팅 15
5. 사용자환경 - 계속 대상소스의성격, 개발팀및부서등에따라 Grouping 하여구분하여관리가능 대상소스및서비스등과관련된라이브러리소스에대해서도일관되게관리가능 16
5. 사용자환경 - 계속 Group 및 Project 와같이 Grouping 된대상에대해서 Code Type 별 Resource Type 별통계결과를리포팅 Client 환경에서직접리포팅된대상에대한소스파일을 Viewing 가능 17
6. 상세기능 Check Items 1. Unreleased Memory 7. Cursor/Prepare Declaration in a Loop 2. Unclosed File 8. Unused Cursor and Prepare 3. Unclosed Cursor 4. Unclosed Connection 5. Uncommitted Transaction 6. Unreachable Code 9. DB Query not in a transaction 10. DB Connection with no queries 11. Functions with an incorrect number of parameters 12. XA Operations in Non-XA mode or Vice Versa 18
6. 상세기능 - 계속 Case 1. Unreleased Memory 661, 662라인에서할당한변수에대해 702라인에서정상적으로 free() 를하고함수를 return하지만, 732라인에서는해제하지않고 return한다. A-max 메모리누수로인하여실행속도가저하된 733: } 다. 서비스다운및기능정지등의요인이될수있다 661: in = (IN *)malloc( sizeof ); 662: out = (OUT *)malloc( sizeof ); 690: if (ret!= 0) { 693: free((char *) in) ; 694: free((char *) out) ; 701: error(err_code, msg_hdr, ); 702: return FAIL; 703: } 724: if ( sqlca.sqlcode!= 0 ) { 726: sprintf(errmsg->msg2, Code: %d\n", ); 727: error_mesg(errmsg, 1 728:, Open cursor error" 729:, errmsg->msg2 730:, ""); 731: error(err_code, msg_hdr, ); 732: return FAIL; 3498: void error(ecode, m_hdr, emsg, ) 3504: { 3557: return ecode; 3558: } Defect Case 1 19
6. 상세기능 - 계속 Case 2. Unclosed File A-max 54: int file_open_func() 55: { 85: FILE *fp_0, *fp_1, *fp_2; 169: if ((fp_0 = fopen(fname_0, "w"))!= NULL) 184: if ((fp_1 = fopen(fname_1, "w"))!= NULL) 169, 184, 199라인에서각각해당파일을 open하고, 259라인에서 SQL error 발생할경우와 316라인에서 error 발생할경우 close 하 199: if ((fp_2 = fopen(fname_2, "w"))!= NULL) 지않고return한다. 251: if(sqlca.sqlcode!= ORA_SUCCESS) 252: { 259: return ret; 260: } 308: if (ret!= SUCCESS ) 309: { 파일에대해서접근이거부된다. 316: return ret; 파일의자료일부가상실되거나, 파일자체가훼손될수있다. 운영체제에서 Open 파일의개수를제한함에따라최종적으로는파일을 Open하는데 error가발생할수있다. 317: } 381: fclose(fp_0 ); 382: fclose(fp_1 ); 383: fclose(fp_2 ); 421: return ret; 422: } Defect Case 1 20
6. 상세기능 - 계속 Case 3. Unclosed Cursor 307라인에서커서를 open하고 407라인에서 close하지만, 337라인에서 Fetch error가발생할경우와 401라인에서 error 가발생할경우 close 하지않고 return한다. 자원누수로인하여실행속도가저하된다. 서비스다운및기능정지등의요인이될수있다. A-max 307: EXEC SQL OPEN C_INF_CURSOR; 308: 309: if (sqlca.sqlcode!= ORA_SUCCESS) { 310: fprintf(stderr, td Found error to open cursor!"); 311: return FAIL; 312: } 320: EXEC SQL FETCH C_INF_CURSOR 321: INTO :C_STR_NAME; else if (sqlca.sqlcode!= ORA_SUCCESS) { 337: return RtnStatus ; 338: } 393: if (rt = setinfotail(c_str_name->arr, ) 394:!= SUCCESS 395: ) { 401: return ret_status; 402: } 407: EXEC SQL CLOSE C_INF_CURSOR; Defect Case 1 21
6. 상세기능 - 계속 Case 4. Unclosed Connection 96라인의 DB connection에대해서해당프로그램은명시적으로 disconnection을하지않는다. Database Connection 을종료하지않고프로그램을종료하게되면, 진행중이던트랜잭션이 Rollback된다. A-max 50: main(int argc, char *argv[]) 51: { 96: EXEC SQL connect to call_center'; 97: if (SQLCODE) 98: { 99: err = set_errmsg(); 100: printerr(datbase connection failure"); 101: exit (err); 102: } 305: EXEC SQL commit work; 306: if (SQLCODE) 307: { 308: err = set_errmsg(); 309: printerr( Could not update user info.!"); 310: exit (err); 311: } 313: fclose(f_ctrl); ctrl); 314: 315: process_success(); 316: exit(0); 317: } Defect Case 1 22
6. 상세기능 - 계속 Case 5. Uncommitted Transaction A-max 178: int com_nms_recv(in_buf, out_buf, status) 179: i_trbf_t *in_buf; 180: o_trbf_t *out_buf; 181: long *status; t 182: { 218: tx_begin(); 219: if (s_tm) { 218라인에서시작된 transaction에대해서 437라인에서는 rollback으로, 623라인에서는 commit으로종료하지만, 443라인에서는해 220: EXEC SQL set lock mode to wait 10; 당 transaction에대해서종료하지않고 return한다. commit 문이사용되지않으면, 트랜잭션이시작된이후의변경된사항에대해서모두 rollback 될수있다. 374: } 436: if (st_code == 0) { 437: tx_rollback(); 438: edit_md_proc(st_code, in_buf, out_buf); 439: return (0); 440: } 441: else if (st_code < 0) { 442: message(st_code); 443: return (rcd); 444: } 623: tx_commit(); 629: } Defect Case 1 23
6. 상세기능 - 계속 Case 6. Unreachable Code 7421 라인에서 return 코드에의해뒤에따르는함수및 CURSOR 해제가수행되지않는다. A-max 작성된코드가수행되지않음으로원하지 7428: } 않는결과를초래할수있다. 불필요한코드가실행프로그램에존재할수있다. 7371: while(1) { 7377: if (josa->gy_cnt > GYA_CNT ) { 7395: return -1; 7396: } 7402: if (SQLCODE == SQLNODATA) { 7406: break; 7407: } else if (SQLCODE!= SQLOK) { 7421: return -1; 7422: 7423: fda_error_process (SQLCODE); 7424: 7425: EXEC SQL close c_bj; 7426: EXEC SQL free c_bj; 7427: return SQLCODE; 7490: } Defect Case 1 24
6. 상세기능 - 계속 Case 7. Cursor/Prepare Declaration in a Loop 1068 라인에서동일한내용의커서선언과해제가 for 문내에서반복적으로수행되고있다. 반복적으로리소스의할당및해제가발생함으로써실행속도가저하될수있다. 서비스다운및기능정지등의요인이될수있다. A-max 946: for(size_t i=0; I < rec_cnt; i++) { 1068: EXEC SQL DECLARE cust_curs 1069: CURSOR FOR 1070: select a.cust_no, a.account_no, b.* 1071: from info_db:master_info a, 1072: info_db:master b, 1073: info_db:gt_setting c 1074: where a.mng_no no = acs_mng_no no 1075: and a.bkn_code = 1 1076: and a.cust_no = b.cust_no 1077: and a.account_no = b.account_no 1078: and a.kbn_code = b.kbn_code 1079: and b.acs_y yn in ('1','2') 1080: and b.cust_no = c.cust_no 1081: and b.cust_no = c.ret_cust_no 1082: and c.reject_yn = '1'; 1097: EXEC SQL FREE cust_curs; 1204: } Defect Case 1 25
6. 상세기능 - 계속 Case 8. Unused Cursor or Prepare A-max 651: static int 652: ctx_logger_write(_ctx_logger_t *ctx) 653: { 690: bzero(&in, sizeof(app_logger_f001_t)); 691: 692: EXEC SQL OPEN acc_f001_cur; 693: 692라인에서 CURSOR를 OPEN하고 700라인에서 CLOSE하지만, 해당커서를사용하지않고 return한다. 694: ret = write_logger(ctx, &in); 사용하지않는 Cursor 및 Prepare 에의해 DBMS의 Operation을유발하게되어실행속도가저하될수있다. 불필요한자원낭비를초래한다. 695: if (ret!= SUCCESS) { 696: error_message(ret, ctx, msg); 697: return RC_FAIL; 698: } 699: 700: EXEC SQL CLOSE acc_f001_cur; 701: 702: return RC_SUCCESS; 703: } Defect Case 1 26
6. 상세기능 - 계속 Case 9. DB Query not in a transaction A-max 165: bool alg_set_rects(char *pszfile) 166: { 183: EXEC SQL BEGIN WORK; 184: 191: strcpy( szloadfile, ALG_DATA_FILE); 192: strcat( szloadfile, pszfile); 183라인에서 Transaction이시작되어 314라인에서종료되었지만, 중간에 SQL문을사용하고있지않다. 193: strcat( szloadfile, ".dat"); 사용하지않는트랜잭션모드를만들게됨 317: } 으로써불필요한 DBMS operation이수행된다. 불필요한자원낭비를초래한다. 194: if((fp = fopen(szloadfile, "r")) == NULL) { 195: error_print(); 196: return FALSE; 197: } 309: fclose(fp); 314: EXEC SQL COMMIT WORK; 315: 316: return TRUE; 317: } Defect Case 1 27
6. 상세기능 - 계속 Case 10. DB Connection with no queries 398라인에서 DB connection 함수를호출하지만, 해당프로그램에서는 DB 관련된작업을수행하지않는다. A-max DB 작업을하지않는프로그램에서 DB 683: return 0; connection을생성함으로써, 프로그램의실행속도가저하될수있다. 불필요한자원낭비를초래한다. 286: bool ConnectDB(const char *pszservername) 287: { 312: EXEC SQL CONNECT :szuserid 313: IDENTIFIED BY :szpassword; 321: } 346: int main(argc, argv) 347: int argc; 348: char **argv; 349: { 398: if (!ConnectDB(COMM_DB_W2)) 399: { 400: cgierror(e_db_conn_s2); 401: exit(cgi_noconn) 402: } 683: return 0; 684: } Defect Case 1 28
6. 상세기능 - 계속 Case 11. Functions with an incorrect number of parameters A-max 1355라인에서호출한함수에서인자는 4개가사용되었지만실제해당함수가정의된 753라인에서 5 개의인자를가지는함수로선언되어 761: { 있다. 함수호출시인자를잘못전달함으로써원 1450: } 하지않는결과를초래할수있다. 753: static long check_goods ( 754: idx_no, flag, ms_goods_in, 755: ms_goods_out, err_msg) 756: int idx_no, 757: unsigned short flag, 758: char * ms_goods_in, 759: char * ms_goods_out, 760: char * err_msg 829: return 0; 830: } 1097: long goods_select(idx, kind, ) 1104: { 1355: rt = check_goods (idx, flag, in, errmsg); 1450: } Defect Case 1 29
6. 상세기능 - 계속 Case 12. XA operation in Non-XA mode or Vice Versa 388라인에서호출한함수를보면 774라인에서 Non-XA mode에서 XA operation을사용하였음을알수있다. A-max DB 를처리하는데있어서 XA 와 Non-XA 의 799: } 혼용은 DBMS 무결성에위배된다. 데이터의질적저하를초래한다. 374: EXEC SQL OPEN dml_cur; 387: if (sdt->type == DML_TARGET) { 388: ret = dml_check_target(sdt); t( dt) 717: } 718: 719: static int 720: dml_check_target(stp_dml_target_t t *sdt) 721: { 747: if (sdt->in == 0) { 748: print_message(std, err_cd, msg); 749: return RC_FAIL; 750: } 774: tx_open(); 798: return RC_SUCC; 799: } Defect Case 1 30
6. 상세기능 - 계속 Case 13. Use for Standard API Function in C A-max 165: bool alg_set_rects(char *pszfile) 166: { 183: EXEC SQL BEGIN WORK; 184: 191: strcpy( szloadfile, ALG_DATA_FILE); 192: strcat( szloadfile, pszfile); 191라인에서사용한 strcpy, strcat 함수는 size를포함하는 strncpy, strncat 함수를사용하도록한다. 193: strcat( szloadfile, ".dat"); 문자열과관련된함수를사용할때에는가 317: } 능한 Size를포함하는함수를사용하도록권장한다. 이는정의된버퍼크기를초과하여사용하게될경우발생할수있는데이터의손실에대해서사전에코드의안정성을유지하기위한방법이다. 194: if((fp = fopen(szloadfile, "r")) == NULL) { 195: error_print(); 196: return FALSE; 197: } 309: fclose(fp); 314: EXEC SQL COMMIT WORK; 315: 316: return TRUE; 317: } Defect Case 1 31
7. 지원환경 Operating System HP-UX Middleware Tuxedo ATMI in C IBM AIX Tmax XATMI & TX in C Sun Solaris FreeBSD Linux Windows Database Oracle Pro*C Informix ESQL/C Compiler GNU gcc HP-UX acc DB2 SQC IBM xlc Sun cc ANSI C 호환 Comiler 32
III. 적용사례 33
1. 적용사례 적용사례 : 국내 A 금융사차세대뱅킹시스템구축및운영에적용중 적용사례 적용대상 : 온라인, 배치및 DBIO 모듈등약 50,000000 본이상의소스에적용 개발단계 : 단위별검증및팀별일괄검증방법을이용하여개발과정시적용 적용방법 운영단계 : 추가및수정후이행요청시소스검증보고에따른반려및이행 OS : HP-UX itanium64 UNIX Operating System Database : Oracle 10g Database System 적용시스템 Middleware : Tmax v3.14 System 34
2. 유형별진단결과요약 By Code Type By Resource Type Types Messages Types Messages General 4,233 Memory 4,670 SQL 21,135 File 2,133 Middleware 1,122 Connection 1,053 Total 26,490 Cursor 8,392 Etc 10,242 Total 26,490 2,352 개의파일을대상으로진단한결과요약임. 35
3. 적용시스템구조 36
Thank you!!! 인프라소프트 www.infrasoft.co.kr 02-468-2570 37