VS2005 배포 했을 때 실행이 안될 경우(아래와 같은 에러 메세지)

사용자 삽입 이미지


아래 링크 타고 들어가서 설치하여라.
http://www.microsoft.com/downloads/details.aspx?familyid=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=en

참고로 SP1용 배포 패키지는 따로있다;;;
Creative Commons License
Creative Commons License
2009/11/02 13:32 2009/11/02 13:32

[로그인][오픈아이디란?]

앞으로 지속적으로 추가 될 Makefile 템플릿(탭으로 구분 됨)

Makefile

TARGET = main
OBJS = main.o \
 test.o

LIBS =

# -L./ -L./(DIR)
LIB_DIR =

# -I./ -I/(DIR)
INCLUD_DIR =

SRCS = $(OBJS:.o=.c)

CC = gcc
CPP = g++

#CFLAGS += $(INCLUDE_DIR)
#CFLAGS += -Wall -O2 -g

CPPFLAGS += $(INCLUDE_DIR)
CPPFLAGS += -Wall -O2 -g

LDFLAGS += $(LIB_DIR)

$(TARGET) : $(OBJS)
 @echo "======== C++ Creating Object file >> [1;32m$<[0m << ========"
 $(CPP) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(OBJS) -o $@ $(LIBS)

%.o:%.cpp
 $(CPP) -c $(CPPFLAGS) $(CPPFLAGS) -o $@ $<
 
all : $(TARGET)

clean :
 rm -rf *.o
 rm -rf $(TARGET)

to be continue..


Makefile

Makefile download




Creative Commons License
Creative Commons License
2009/10/27 00:26 2009/10/27 00:26

[로그인][오픈아이디란?]

문자열 비교를 위해 strcmp를 많이 사용하는데 가끔 비교할 문자열 개수를 지정할 수 있는 함수 strncmp를 사용하기도 한다.  평소에 아무 의심없이 strncmp를 사용했는데 오늘 strncmp 함수는 버그를 유발 시키는 가능성이 있다는 것을 알았다.(내가 유발 시켰나?-_-) strncmp 함수 자체가 버그가 있다는 뜻이 아니라 버그가 있는 코드를 만들어 낼 수 있다는 이야기.

예를들어 보면 SYSTEM_* 의 문자열은 list라는 배열에 저장되어 있다고 생각하자. 그리고 COMPARE 함수의 value 값에는 list의 각인자의 내용이 들어와 list 배열의 인덱스값을 리턴한다.


문제가 있는 코드

SYSTEM_WINDOW
SYSTEM_WINDOW_TITLE
SYSTEM_WINDOW_MGS
SYSTEM_WINDOW_SECURE
SYSTEM_WINDOW_ACCESS

int COMPARE(char* value)
{
for(i=0; i<MAX_SYMBOL; i++)
{
if( strncmp(value, list[i], strlen(list[i])) == 0 )
break;
}
return i;
}

자~ 어때요. 참 쉽죠? 쉽긴 개뿔이-_- 위의 코드는 오류가 있는 코드다. 밑에 보기전에 어떤 오류가 존재하는지 한번 찾아보도록!


정답 :

에러가 나는 케이스는 value 값에 SYSTEM_WINDOW_TITLE, list[i]에는 SYSTEM_WINDOW(i값이 0)이 들어있는 경우이다. 이 두개의 문자열은 같지 않음에도 불구하고 위 코드에서는 같은 것으로 통과 시켜버린다. list[0] 에 들어가있는 SYSTEM_WINDOW 13개의 문자열만 비교하게 된다. value값에도 13자리(SYSTEM_WINDOW)는 같으므로  _TITLE은 무시해버리게 된다. 즉 무한루프를 돌다가 배열 끝에가서 Segment fault.

이렇게 무의식적으로 오류가 생기는 코드를 작성할 수 있으니 strncmp를 사용할 때 count 값은
인자로 들어오는 바뀌는 값에 걸자 ㅠ_ㅠ sizeof(value) ㅇㅋ?
Creative Commons License
Creative Commons License
2009/07/09 21:29 2009/07/09 21:29
Tag // , ,

[로그인][오픈아이디란?]

CUnit 의 사용

from Programming 2008/11/02 02:47

1. CUnit 의 실행 모드

  CUnit의 실행 모드에는 아래의 4가지 모드가 존재한다.

  • Automated 모드(Automated.h 인클루드) - 출력을 XML 파일로 한다.
  • Basic 모드(Basic.h 인클루드) - 모든 플랫폼에서 사용 가능하고 stdout(표준 출력)으로 출력한다.
  • Console 모드(Console.h 인클루드) - 모든 플랫폼에서 사용 가능하고 stdout(표준 출력)으로 출력한다.
  • Curses 모드(CUCurses.h 인클루드) - 리눅스 커널의 make menuconfig 화면과 같은 출력(링크시 -lcurses 옵션)

      ※ 익숙하지 않은 사람은 Console 모드로 진행을 추천

2. 테스트를 하기 위한 최소 단위

  * CU_TestInfo 라는 구조체로 존재

CU_TestInfo.JPG

  * CU_TestInfo 의 구조체는 다음과 같음

typedef struct CU_TestInfo { 
     char *pName;                       /**< Test name. */ 
     CU_TestFunc pTestFunc;             /**< Test function. */ 
} CU_TestInfo;


3. 테스트 Suite

  * CU_TestInfo가 모여서 Suite 를 구성함

 CU_SuiteInfo(2).JPG

  * CU_SuiteInfo의 구성
typedef struct CU_SuiteInfo {
        char             *pName;         /**< Suite name. */
        CU_InitializeFunc pInitFunc;     /**< Suite initialization function. */
        CU_CleanupFunc    pCleanupFunc;  /**< Suite cleanup function */
        CU_TestInfo      *pTests;        /**< Test case array - must be NULL terminated. */
} CU_SuiteInfo;

4. 사용 순서

① 테스트를 하기 위한 include
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include "./include/CUnit/CUnit.h" 
#include "./include/CUnit/Console.h” 
② CU_TestInfo의 작성
CU_TestInfo test_array[] = {
                { "Test_1", test_sum1 },
                { "Test_2", test_sum2 },
                { "Test_4", test_sum3 },
                { "Test_4", test_sum4 },
                CU_TEST_INFO_NULL
};

③ CU_SuiteInfo 작성
CU_SuiteInfo suites_array1[] = {
                { "Suit_1", NULL, NULL, test_array },
                CU_TEST_INFO_NULL
};

기본적인 틀
CU_initialize_registry();
errorCode = CU_register_suites(suites_array1);
CU_console_run_tests();
CU_cleanup_registry();

소스

example.c

gcc -o example example.c -lcunit  -L/($CUNIT_LIB)

5. 실행 화면run.jpg

 참고 사이트 http://blog.naver.com/yuzico?Redirect=Log&logNo=130017611239

  • written by 이재철
Creative Commons License
Creative Commons License
2008/11/02 02:47 2008/11/02 02:47

[로그인][오픈아이디란?]

아주 간단하게 암호화를 할 수 있다.

그것도 키를 사용해서!

비트를 쉬프트하기엔 허접하고 그것보다 약간 아주 쪼끔 덜 허접한 XOR 암호화 방법이 있다.
이름처럼 XOR 연산을 이용한 방법인데 많은 언어에서 '^' 이 모양으로 XOR 연산을 지원한다.
예를들어 아래와 같은 문서를 암호화 한다고 하자

1101 1100 0010 0101 0010 1010 1111 0111

암호화할 문서의 키는 'ENC' 라고 하자. ENC 는 아스키 값으로
0x45, 0x4E, 0x43 이다. 이 ENC라는 비트열로 위에 나온 문서와 XOR 시킨다.
 
   1101 1100 0010 0101 0010 1010 1111 0111
   0x4  0x5  0x4  0xE  0x4  0x3  0x4   0x5
  (    E   ) (    N   )(    C   )(    E    ) ...

암호화 할때도 복호화 할때도 각 비트에 XOR 을 해주면 된다. 첫번째 4개 비트로 예를들어 보면
1101 은 0x4 와 XOR 연산을 통하면 1001 이 나온다.  다시 복호화 하기 위해 1001 을 0x4 와  XOR 연산을 하면 1101 이 나온다.

이러한 허접한 방법이 아닌 더 좋은 알고리즘이 필요하면 openSSL 의 도움을 받으면 된다.
DES, AES, RSA, Blowfish 등 대칭, 비대칭키를 사용하는 알고리즘 모두 준비가 되어있다. 아래는 적당히 짜본 소스
/**
 * @brief	 key : 암호화에 사용될 키
 * @param	 keyLength : 키의 길이
 * @param	 in : 암호화를 시킬 대상
 * @param nBytes : in의 길이
 * @return success or fail
 */
int XorCrypto(unsigned char* key, int keyLength, unsigned char* in, int nBytes)
{
	int i = 0;

	if( nBytes < keyLength ) { return -1; }

	while( i < nBytes )
	{
		in[i] ^= key[i%keyLength];
		i++;
	}
	return 0;
}
Creative Commons License
Creative Commons License
2008/10/04 18:07 2008/10/04 18:07

[로그인][오픈아이디란?]