[C언어] 치명적인 오류를 가진 (자주 틀리는)소스코드 모음

shint의 이미지

잘못 사용한 코드 모음... ㅠ_ㅠ...

-------------------------------
증상
-------------------------------
- 프로그램이 자꾸 멈춘다.
- 프로그램이 if() 조건문을 넘어가 버린다.
- 프로그램이 자꾸 메모리가 넘친다.
- 프로그램이 자꾸 오류가 발생한다.

-------------------------------
코드를 확인하게 된. 프로그래머의 반응
-------------------------------
- 컴퓨터가 부셔진다.
- 비명이 발생한다.
- 얼굴이 하얗게 된다.
- 얼굴이 빨갛게 된다.
- 식은 땀이 흐르게 된다.

-------------------------------
- DevC++ 컴파일 옵션에 추가했다가 cout 이 오류가 남
-------------------------------
-lstdc++

Dev-CPP & wxWindows DevPak Setup Guide
http://cafe.naver.com/devcpp/63

-------------------------------
- 클래스 생성자와 소멸자. public:을 빼먹었다.
-------------------------------
class CTest
{
};

-------------------------------
- 클래스 생성자와 소멸자에서 {} 중괄호를 빼먹었다.
-------------------------------
class CTest
{
public:
CTest(){};
~CTest(){};
};

-------------------------------
- if( A = B )
-------------------------------
if( A == B ) 를 == 으로 잘못 사용한 경우.
최소한 1시간 찾게 된다.

-------------------------------
- {} 를 빼먹은 경우. 코드를 잘못 보거나. 다른 코드가 실행되거나. 지워지기도 한다.
-------------------------------

if( !VAL ) fn();
fn2();

for(i=0; i<10; i++)
fn();

-------------------------------
- recv 한 구조체 이름을 잘못 알고 있는 경우
-------------------------------
구조체의 크기를 모르니. 잘못 파싱한다.

첫 2바이트의 크기나 id로 구분할 수 있다.

-------------------------------
- 초기화를 하지 않은 경우
-------------------------------
오류코드
int a_recvCnt = 0;
int a_strLen;
a_recvCnt += a_strLen;

정상코드
int a_recvCnt = 0;
int a_strLen = 0;
a_recvCnt = a_recvCnt + a_strLen;

-------------------------------
- 부동소수점을 찍지 않은 경우
-------------------------------
오류코드
double d;
d = 2 * pow(3,2);

정상코드
double d = 0.0;
d = 2.0 * pow(3.0, 2.0);

-------------------------------
- printf()의 데이터형 출력을 잘못한 경우
-------------------------------
오류코드
float f = 10.12345678901234567890;
printf("%x", f)

정상코드
float f = 10.12345678901234567890;
printf("%f", f)

-------------------------------
- 함수 이름을 잘못 알고 사용한 경우
-------------------------------
double d = 0.0;
d = 2.0 * sqrt(3.0, 2.0);

sqrt 는 root 루트
pow 는 승'의 제곱값 (제곱근'은 또 다르다.)

-------------------------------
- 초기화를 하지 않은 경우
-------------------------------
char * p = NULL;

-------------------------------
- 줄을 잘못 맞춰서. 잘못 정리하다 코드오류가 난 경우
-------------------------------
fn();{
test(val()+2*3);
}

-------------------------------
- POINT 구조체의 x y 값은 LONG 타입이었다.
-------------------------------
typedef struct
{
LONG x;
LONG y;
}POINT;
POINT pt;

pt.x = 10;
pt.y = 20;

-------------------------------
- 배열에 범위를 넘는 값을 입력한 경우.
-------------------------------
char buf[4]; //buf[0] buf[1] buf[2] buf[3] (4개)
buf[4] = 'a'; //없는 배열에 값을 할당한 경우

-------------------------------
- TRACE()에 255자를 넘게 입력한 경우.
-------------------------------
char buf[255];
TRACE("%s", buf);

-------------------------------
- 메모리 할당이 안된 포인터를 던지는 경우.
-------------------------------
char * p;
int len = 10;
send(sock, p, len, 0);

-------------------------------
- 포인터 4바이트 크기로 사용하는 경우
-------------------------------
char * p;
int len = sizeof(p);
send(sock, p, len, 0);

-------------------------------
- 포인터 4바이트에 문자열갯수로 사용하는 경우
-------------------------------
char * p = (char*) malloc (10);
int len = strlen(p);
send(sock, p, len, 0);

-------------------------------
- 메모리 할당이 안된경우.
-------------------------------
char * p;
recv(sock, p, len, 0);
free(p);

-------------------------------
- recv하는 크기보다. 메모리 할당된 크기가 작은경우.
-------------------------------
char * p = (char*) malloc (10);
recv(sock, p, len, 0);
free(p);

-------------------------------
- 배열크기보다 큰 값을 입력한 경우 (실행은 되지만. 스택오버플로우가 생겼다.)
-------------------------------
typedef struct
{
char program_name[10];
}REQ;
REQ req;
strcpy(req.program_name, "simpleDB_Client");

-------------------------------
윈도우 작업 관리자에서 확인해봐야 할것들
-------------------------------
- CPU. 메모리 점유율
- GDI. HANDLE. THREAD 갯수

-------------------------------
CRT_DBG 를 활용한 메모리 릭 확인
-------------------------------
- http://egohim.blog.me/70074738205
- http://blog.naver.com/dolicom?Redirect=Log&logNo=10090775505

-------------------------------
구조체 초기화
-------------------------------
- https://kldp.org/node/154402

Forums: 
익명 사용자의 이미지

잘보고가요 ㅎㅎ

익명 사용자의 이미지

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8800&ref=8800

분명 같은 글이긴 한데, 두 사이트 댓글 분위기가 너무나도 다른 것 같네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.