Line Numbers add-in for Visual C++ 6


그런데 종료할 때 마다 crash report 메시지 뜨네요





MS Visual C++ 6에서 debug 중지 시, 프로세스 좀비되는 버그




C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin




c++ / valgrind on linux

Dev./Sec. Study/C/C++ 2014.02.06 22:11

뭐 큰건 아니고...

ubuntu 10.10 에서 package 설치 한 valgrind 3.6.0 에선 c++로 작성한 바이너리의 메모리 릭 체크를 못하더라

삭제하고 3.9.0 을 소스 컴파일 해서 설치했더니 잘되더라


'Dev./Sec. Study > C/C++' 카테고리의 다른 글

c++ / valgrind on linux  (0) 2014.02.06
The "goes toward" operator  (0) 2013.03.15
CRC32 implementation from apple open source  (0) 2012.11.30
동생의 스네이크 게임  (0) 2012.11.11
Struct Hack  (0) 2012.08.23
[펌][C++] new는 null을 return하는가?  (0) 2012.03.07






는 내꺼




The "goes toward" operator

Dev./Sec. Study/C/C++ 2013.03.15 11:37

The "goes toward" operator

        void doStuff(int count) {
                while(count --> 0) 

일반적으로 사용하는 것과 다른 점이 공백 위치 뿐인데

엄청난 직관력

일수도 있고 아닐 수도 있고.

출처 :

'Dev./Sec. Study > C/C++' 카테고리의 다른 글

c++ / valgrind on linux  (0) 2014.02.06
The "goes toward" operator  (0) 2013.03.15
CRC32 implementation from apple open source  (0) 2012.11.30
동생의 스네이크 게임  (0) 2012.11.11
Struct Hack  (0) 2012.08.23
[펌][C++] new는 null을 return하는가?  (0) 2012.03.07




CRC32 implementation from apple open source

Dev./Sec. Study/C/C++ 2012.11.30 17:46


crc32.c   [plain text]

 *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
 *  code or tables extracted from it, as desired without restriction.
 *  First, the polynomial itself and its table of feedback terms.  The
 *  polynomial is
 *  X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
 *  Note that we take it "backwards" and put the highest-order term in
 *  the lowest-order bit.  The X^32 term is "implied"; the LSB is the
 *  X^31 term, etc.  The X^0 term (usually shown as "+1") results in
 *  the MSB being 1
 *  Note that the usual hardware shift register implementation, which
 *  is what we're using (we're merely optimizing it by doing eight-bit
 *  chunks at a time) shifts bits into the lowest-order term.  In our
 *  implementation, that means shifting towards the right.  Why do we
 *  do it this way?  Because the calculated CRC must be transmitted in
 *  order from highest-order term to lowest-order term.  UARTs transmit
 *  characters in order from LSB to MSB.  By storing the CRC this way
 *  we hand it to the UART in the order low-byte to high-byte; the UART
 *  sends each low-bit to hight-bit; and the result is transmission bit
 *  by bit from highest- to lowest-order term without requiring any bit
 *  shuffling on our part.  Reception works similarly
 *  The feedback terms table consists of 256, 32-bit entries.  Notes
 *      The table can be generated at runtime if desired; code to do so
 *      is shown later.  It might not be obvious, but the feedback
 *      terms simply represent the results of eight shift/xor opera
 *      tions for all combinations of data and CRC register values
 *      The values must be right-shifted by eight bits by the "updcrc
 *      logic; the shift must be unsigned (bring in zeroes).  On some
 *      hardware you could probably optimize the shift in assembler by
 *      using byte-swap instructions
 *      polynomial $edb88320
 * CRC32 code derived from work by Gary S. Brown.

#include <sys/param.h>
#include <sys/systm.h>

static uint32_t crc32_tab[] = {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
	0xe963a535, 0x9e6495a3,	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
	0xf3b97148, 0x84be41de,	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,	0x14015c4f, 0x63066cd9,
	0xfa0f3d63, 0x8d080df5,	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,	0x35b5a8fa, 0x42b2986c,
	0xdbbbc9d6, 0xacbcf940,	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,	0x76dc4190, 0x01db7106,
	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d

crc32(uint32_t crc, const void *buf, size_t size)
	const uint8_t *p;

	p = buf;
	crc = crc ^ ~0U;

	while (size--)
		crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);

	return crc ^ ~0U;

'Dev./Sec. Study > C/C++' 카테고리의 다른 글

c++ / valgrind on linux  (0) 2014.02.06
The "goes toward" operator  (0) 2013.03.15
CRC32 implementation from apple open source  (0) 2012.11.30
동생의 스네이크 게임  (0) 2012.11.11
Struct Hack  (0) 2012.08.23
[펌][C++] new는 null을 return하는가?  (0) 2012.03.07
C, CRC32




동생의 스네이크 게임

Dev./Sec. Study/C/C++ 2012.11.11 22:29

엥시가 2012학년도 1학년 1학기 C 언어 과제로 만든 스네이크.

허물 벋기 알고리즘 ㄷㄷ해



'Dev./Sec. Study > C/C++' 카테고리의 다른 글

The "goes toward" operator  (0) 2013.03.15
CRC32 implementation from apple open source  (0) 2012.11.30
동생의 스네이크 게임  (0) 2012.11.11
Struct Hack  (0) 2012.08.23
[펌][C++] new는 null을 return하는가?  (0) 2012.03.07
terms for programming  (0) 2011.12.22




Subversion with HTTPS/Trac. on Ubuntu 12.04 LTS

Dev./Sec. Study/참고자료 2012.09.19 17:43

손이 많이 가네요;

삽질 끝에 성공하고 정리하는 거라서,

마지막에 안될 수도 있지만.. 그쪽은 각자 센스로 커버합시다.

설정 파일들 건드리기 전에 준비부터 다 해봅시다.

1. apt 관리자를 이용해 필요한 패키지 설치

subversion python libapache2-svn libapache2-mod-python python-setuptools python-genshi python-sqlite

2. openssl로 인증서 만들기

<SSL 인증서 넣어둘 경로에서> # openssl req -new  -x509 -nodes -out server.crt -keyout server.key

3. python easy_install을 이용해 필요한 모듈 설치

easy_install babel

easy_install Pygments

easy_install docutils

easy_install epydoc

easy_install textile

4. trac 및 trac plugin 설치

# trac 설치

svn co trac

cd trac

./ compile_catalog --use-fuzzy

./ install

# trac plugin

# 들어가서 필요한 플러그인 받아서 설치

# 우선 주요 플러그인만..

# AccountManagerPlugin, SvnAuthzAdminPlugin, TracIniAdminPanelPlugin, PermRedirectPlugin

이제 필요한건 대충 설치 한 것 같으니, 설정하러 가봅니다.

1. 우선 apache2부터 합니다.

# /etc/apache2/sites-enabled 디렉터리에서

cp ../sites-available/default-ssl ./ssl

# /etc/apache2/sites-enabled/ssl 파일을 열어서

SSLCertificateFile    <2번의 SSL 인증서 넣어둘 경로에서>/server.crt

SSLCertificateKeyFile <2번의 SSL 인증서 넣어둘 경로에서>/server.key

2. https를 위한 apache2 configuration

# /etc/apache2/sites-enabled/ssl 파일을 열어서 VirtualHost *:443 으로 바꿔주고,

# 기본 root url로 접속할 디렉터리를 각자 맞게 지정해줍니다.

# (내비둬도 되고요. 바꾸시면 default http 도 바꿔주시는게 좋을 듯?)

# 그리고 전 제가 관리하는 디렉터리에서 직접 trac/svn 경로 설정 파일을 두려고 .vhost 라는 파일을 만들었어요.

# sites-enabled/ssl 파일에는 제일 밑에 아래처럼 해두었어요

include <VIRTUAL_HOST_PATH>/.vhost

# 이렇다 보니, apache2도 제 계정으로 동작하는게 편해서 데몬 계정을 제 계정으로 바꿨어요

# /etc/apache2/envvars에서 이렇게.



# ssl 설정이 끝났다면, apache2에 ssl 모듈을 enable 시켜줍니다.

sudo a2enmod ssl

# 참고로 작업이 끝난 후의 .vhost 파일 내용은 이래요.

<Location /trac>

    SetHandler mod_python

    SetEnv PYTHON_EGG_CACHE /home/repository/trac/.cache

    PythonHandler trac.web.modpython_frontend

    PythonOption TracEnvParentDir /home/repository/trac

    PythonOption TracUriRoot /trac


<Location /svn>

    DAV svn

    SVNParentPath /home/repository/svn

    AuthType Basic

    AuthName "cheroxy"

    AuthUserFile /home/repository/.passwd

    AuthzSVNAccessFile /home/repository/svn/authz


        Require valid-user



# <LimitExcept>는 권한이 필요 할 때만 인증하도록 해줍니다

# 계정 관리는 아래에서 따로 합니다.

# 만약 설치 후 첫 접속에서, 관리자 권한으로 trac에 접속하지 못하면,

# trac에서 http-basic-authentication 으로 접속하고 설정 후에 복구하시면 될거 같네요

이제 svn과 trac 설정을 해보죠

1. svn repository 및 trac 초기 설정

# 전 /home/repository 에 svn 디렉터리와 trac 디렉터리를 만들어 두고, 각각을 따로 작업했습니다.

# trac은 밑에 .cache 라는 캐시 디렉터리도 만들어줬고요.

# 설명을 위한 프로젝트 명은 cheroxy 예요 :)

# subversion

# svn 명령어 뒤 쪽에 -m 옵션은 changeset 메시지니까 바꾸셔도 됩니다.

svnadmin create /home/repository/svn/cheroxy

svn mkdir file://localhost/home/repository/svn/cheroxy/branches -m "initial structure1"

svn mkdir file://localhost/home/repository/svn/cheroxy/tags -m "initial structure2"

svn mkdir file://localhost/home/repository/svn/cheroxy/trunk -m "initial structure3"

# trac 생성 및 관리자 권한 주기

trac-admin /home/repository/trac/cheroxy initenv

trac-admin /home/repository/trac/cheroxy permission add <USERNAME> TRAC_ADMIN

# 계정 파일 생성 해 줘야해요. 전 .passwd라는 파일로 만들었습니다

htpasswd -c .passwd <USERNAME>

# authz 파일도 만들어요

# 대문자로 된 것들이 직접 써주면 됩니다

# 그룹 지정도 가능하고 프로젝트 하위의 특정 경로에 권한을 주는 것도 가능해요

# 아래 예제는 프로젝트에 GROUP1은 읽기/쓰기, USER3은 읽기만, 그 이외에는 아무 권한도 없도록 설정한 것이에요











2. trac 설정. <trac-project>/conf/trac.ini

# svn 경로 입력

# 보통 설치하면 다 연동되는 거 처럼 기재된 내용들이 많았는데, 전 안되서 한참 고민하다가 해결했네요.

# apache2 restart 하고 접속 했더니, 소스보기도 되고 잘되는거 같다 ! 하시면 안해도 될 듯.

# 이건 있는 내용이니 repository_dir 만 수정하시면 됩니다.



authz_file = /home/repository/svn/authz

authz_module_name = cheroxy


repository_dir = /home/repository/svn/cheroxy

# tab-width 조정

# 있는거에서



tab_width = 4

# trac 로그인 페이지 사용하기

# 없으면 추가하시면 되요.


trac.web.auth.loginmodule = disabled

# PermRedirectPlugin

# 없으면 추가하시면되요.

# 참고로 자동으로 설정되면 기본으론 이렇게 나옵니다.

# permredirect.filter.permredirectmodule = enabled


permredirect.* = enabled

# account-manager plugin

# 없으면 추가하시면 되요.

#  password_store 설정 안했더니, trac에서 계정 조회 할 때 이런 오류가 나더라구요.

# This password store does not support listing users.



password_file = /home/repository/.passwd

password_store = HtPasswdStore


# Unsupported version control system "svn"

# 이 처럼 나오는 경우, trac admin page 에서 SubversionConnector 를 enable 시키거나,

# trac.ini 에서 다음과 같이 입력합니다.

tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled

# 이랬는데 No module named 라는 오류가 뜬다면, 다음 패키지를 설치하세요


# python 에서 import svn 해보시고 오류 메시지가 안나타나면 되는 것 같네요.

Invalid command 'AuthzSVNAccessFile', perhaps misspelled or defined by a module not included in the server configuration

# 이렇게 나오면,


# 이 아이를


# 로 symbolic-link 해줍니다

기억을 더듬고 자료를 검색해 가면서 정리하면 이정도 인 것 같네요.


접속 해서 로그인하고 설정은 각자 알아서 해봅시다.

위 과정이 다 되면 이렇게 됩니다.




Struct Hack

Dev./Sec. Study/C/C++ 2012.08.23 09:15

출처 :

요는, length가 0인 array가 포함된 구조체의 메모리 사이즈를 크게 잡으면

멤버인 length 0짜리 array를 동적할당 하듯이 쓸 수 있다는 말인 듯.

구조체를 sizeof (struct __) 만큼이 아니라, 그 이상으로 원하는 만큼 더 잡아서

멤버 array 를 쓰겠다는건데..

array length 0 은 궁금했지만 해보진 않았는데, 이런 효과가 -ㅅ-;;

단순히 동적할당 할 뿐이지만, 잘 쓰면 괜찮은 방법일 듯.

C99 에 명시된 방법이라곤 하는데, 특정 플랫폼의 gcc가 아닌 컴파일러에서도 동작하느냐가 궁금하군요.

코드에 오류라던가 조금 보이는거 같지만, 알아서 걸러봐야겠네요.

Struct Hack

August 14, 2012

What will be the size of following structure?

struct employee


    int     emp_id;

    int     name_len;

    char    name[0];


4 + 4 + 0 = 8 bytes.

And what about size of “name[0]“. In gcc, when we create an array of zero length, it is considered as array of incomplete type that’s why gcc reports its size as “0″ bytes. This technique is known as “Stuct Hack”. When we create array of zero length inside structure, it must be (and only) last member of structure. Shortly we will see how to use it.

“Struct Hack” technique is used to create variable length member in a structure. In the above structure, string length of “name” is not fixed, so we can use “name” as variable length array.

Let us see below memory allocation.

struct employee *e = malloc(sizeof(*e) + sizeof(char) * 128); 

is equivalent to

struct employee


    int     emp_id;

    int     name_len;

    char    name[128]; /* character array of size 128 */


And below memory allocation

struct employee *e = malloc(sizeof(*e) + sizeof(char) * 1024); 

is equivalent to

struct employee


    int     emp_id;

    int     name_len;

    char    name[1024]; /* character array of size 1024 */


Note: since name is character array, in malloc instead of “sizeof(char) * 128″, we can use “128″ directly. sizeof is used to avoid confusion.

Now we can use “name” same as pointer. e.g.

e->emp_id = 100;

e->name_len = strlen("Geeks For Geeks");

strncpy(e->name, "Geeks For Geeks", e->name_len);

When we allocate memory as given above, compiler will allocate memory to store “emp_id” and “name_len” plus contiguous memory to store “name”. When we use this technique, gcc guaranties that, “name” will get contiguous memory.

Obviously there are other ways to solve problem, one is we can use character pointer. But there is no guarantee that character pointer will get contiguous memory, and we can take advantage of this contiguous memory. For example, by using this technique, we can allocate and deallocate memory by using single malloc and free call (because memory is contagious). Other advantage of this is, suppose if we want to write data, we can write whole data by using single “write()” call. e.g.

write(fd, e, sizeof(*e) + name_len); /* write emp_id + name_len + name */ 

If we use character pointer, then we need 2 write calls to write data. e.g.

write(fd, e, sizeof(*e)); /* write emp_id + name_len */

write(fd, e->name, e->name_len); /* write name */

Note: In C99, there is feature called “flexible array members”, which works same as “Struct Hack”

This article is compiled by Narendra Kangralkar. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above