이런 비슷한 실수들 많이 하시나요? (엄청 황당하면서 재밌는(?)

icristi의 이미지

다음 두 코드를 비교해 보세요.

if((fd=open("a.vv", O_WRONLY | O_CREAT | O_APPEND, 0666)<0)){
      fprintf( stderr, "open error!\n" );
      exit(1);
}

if( write( fd, buf, strlen(buf) ) < 0 ){       
      fprintf(stderr, "error\n");
      exit(1);
}       

if((fd=open("a.vv", O_WRONLY | O_CREAT | O_APPEND, 0666))<0){
      fprintf( stderr, "open error!\n" );
      exit(1);
}

if( write( fd, buf, strlen(buf) ) < 0 ) {       
      fprintf(stderr, "error\n");
      exit(1);
}       

첫 번째 코드 (파일에 아무 내용이 써지지 않았음.)

[root@devel test]# ./test
dfadfasdfasdf 
[root@devel test]#

두 번째 코드 (파일에 잘 써졌음)

[root@devel test]# ./test
[root@devel test]#     

버퍼에서 읽은 내용을 파일에 쓰기위한 루틴을 만들던 중 정말 이해할 수 없는 일이 발생하게 되었습니다.
파일 fd에 쓰는데 자꾸 파일은 생성만 되고, 내용은 없는 빈 파일이 되는 것이죠.
왜 그런지? 다른 로직에서 (물론 위에있는 소스는 극히 일부분) 영향을 주는 일은 없는지...? 1시간 정도를 헤매다가 참으로 어이없는 실수를 했음을 발견할 수 있었습니다.

이런 비슷할 실수들 많이 하시나요? ^^;;;;;
(프로그램 많이 해보신 분은 딱 보이겠지만, 저 같이 어설픈 놈은 1시간 헤맨답니다...ㅜ.ㅜ)

ㅡ,.ㅡ;;의 이미지

stdout 에 잘쓰셨네요..


----------------------------------------------------------------------------

kall의 이미지

한참 보다가 안보여서

붙여넣기 하고 diff 돌렸습니다 ;;

그럴 경우는 코드를 좀 길게 쓰는게 최선책 아닐까요...

fd=open("a.vv", O_WRONLY | O_CREAT | O_APPEND, 0666);
if( fd < 0 ){
        fprintf( stderr, "open error!\n" );
        exit(1);
}

KISS 라는 말이 생각 나는군요(Keep It Simple and Stupid)
예전에 그런 문서를 본것도 같은데...어디였는지는 기억이 안나는군요..;;

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

fox9의 이미지

for(i = 0; i < 10; i++);
    printf("%d\n", i);

위의 코드때문에 몇시간 정신못차린적도 있습니다.

김충길의 이미지

가장 황당한 경우는

...
if (fp = NULL) {
...
}

요즘이야 컴파일러가 알려주시면 예전은 안그랬죠.

그리고 GNU쪽에서 상수를 앞으로 돌려쓰는 형태로 코딩하자고 합니다.
상수는 lvalue가 되지 않기 때문에..

if (NULL == fp) {
...
}

screen + vim + ctags 좋아요~

운형의 이미지

kall 님이 diff를 돌렸다는게 이해가 가네요.

Do you think that's the air you are breathing now?

세벌의 이미지

도대체 어디가 다른 건지 -.-

앗 찾았다. diff 안 돌리고...

wooho47의 이미지

음.. 두개를 비교하니까 쉽게 보이지 위에꺼만 있다면 찾기 쉽지 않겠네요.. 1 시간 헤맬만 한데요 ㅋㅋ 더 헤맬지도........

hi 용

icristi의 이미지

wooho47 wrote:
음.. 두개를 비교하니까 쉽게 보이지 위에꺼만 있다면 찾기 쉽지 않겠네요.. 1 시간 헤맬만 한데요 ㅋㅋ 더 헤맬지도........
제 말이...!!

아래 코드는 원인을 발견하고 난 후 고친 것이니까 비교할 수 있는 것이지...
그 전에는 정말 왜 그런지.. 1시간을 족히 헤맸더랬습니다.....
자꾸 stdout 으로 나오니까 시스템적으로(?) 모든 파일 fd가 stdout으로
리다이렉션 설정되어 있진 않나? 하는 의심마저 들었다니까요...
어쨌든 이런 실수들로... 나름대로 얻은 교훈들도 있어서 좋네요..

stoneshim의 이미지

김충길 wrote:

그리고 GNU쪽에서 상수를 앞으로 돌려쓰는 형태로 코딩하자고 합니다.
상수는 lvalue가 되지 않기 때문에..

if (NULL == fp) {
...
}

pynoos님 코딩을 본적이 있는데... 이렇게 사용하시더군요.
그때는 별 생각없이 지나쳤었는데, 이런 이유였군요. 좋은 tip 감사합니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

sorcerer의 이미지

Quote:
KISS 라는 말이 생각 나는군요(Keep It Simple and Stupid)
예전에 그런 문서를 본것도 같은데...어디였는지는 기억이 안나는군요..;;

Keep It Simple, Stupid 로군요^^
저는 Practical C Programming 에서 봤었습니다:)

SOrCErEr

ukira의 이미지

디버거로 한줄한줄 trace하면 좀 더 빨리 찾으셨을꺼 같네요.

thisnome의 이미지

개발하시는 분들이라면 한번쯤은 다들 경험해봤을 일이네요..
한번 호되게 당하고나선 그런부분을 짤때 한번더 보게됩니다..

Ultraedit을 사용하는 친구는 괄호의 짝을 굵게 표시해줘서 그런건 안당한다고 하더군요.. ^^;

icristi의 이미지

kall wrote:
그럴 경우는 코드를 좀 길게 쓰는게 최선책 아닐까요...
KISS 라는 말이 생각 나는군요(Keep It Simple and Stupid)
예전에 그런 문서를 본것도 같은데...어디였는지는 기억이 안나는군요..;;

저는 아직 초짜라서 많이 모르지만, 코딩하는데도 사람마다 주관을 가지고 하게 된다 하지요... [퍼포먼스]를 최대한 고려하는 스타일, [재사용성]을 최대한 고려한 스타일, [코드 가독성]을 고려하는 스타일... 등등...

재학시절 1학년 때 과제로 string 라이브러리(strlen, strcat 등등..)를 직접 구현해보는 과제가 있었는데, 저는 그 때 어떻게 하면 가장 빠르게 가장 간소하고 짧게 코드를 짤 수 있을까를 고민하며 완성해 나아갔습니다.. 과제를 내고 강사님으로부터 피드백이 왔는데, 프로그래밍이라는 것은 간결함도 중요하지만, 책을 쓰듯이 쉽게 읽힐 수 있어야 함도 중요하다며 readability를 강조하셨던 기억이 떠오르네요...

fd=open("a.vv", O_WRONLY | O_CREAT | O_APPEND, 0666);
if( fd < 0 ){
        fprintf( stderr, "open error!\n" );
        exit(1);
}

if((fd=open("a.vv", O_WRONLY | O_CREAT | O_APPEND, 0666))<0){ 
      fprintf( stderr, "open error!\n" ); 
      exit(1); 
} 

실제로 첫 번째와 같은 코딩을 했다면 저 같은 실수를 예방할 수 있었을 것입니다.
하지만 이렇게 두 코드를 컴파일하여 역어셈 해본다면, (솔직히 이 예는 그다지차이를 보일만큼 복잡성 있는 코드는 아닙니다만 컴파일러가 좀 더 똑똑하다면 조금이라도 차이를 줄 수 있을 것 같네요...) 어떤 코드가 단 한줄이라도, 단 한 가지 연산이라도 늘어나게 될까요?

그리고 여러분들은 (물론 무엇을 코딩하느냐라는 상황에 따라 조금씩 다르겠지만) 주로 프로그램을 할 때 주로 어떤 주관과 신념을 가지고 임하시는지 궁금합니다.

vacancy의 이미지

performance critical한 경우가 아니라면
가독성이 높은 쪽이 좋잖을까요.
가독성을 해쳐야할 만큼 performance critical한 경우라면
거의 어셈블리로 코딩하게 되지 않을지요. :?

요즘 컴파일러들은 꽤 좋답니다. 믿으세요. 8)

fibonacci의 이미지

이런 실수는 아니지만...
파이썬 처음 배울때, 인덴트때문에 고생했습니다.

No Pain, No Gain.

정태영의 이미지

thisnome wrote:
개발하시는 분들이라면 한번쯤은 다들 경험해봤을 일이네요..
한번 호되게 당하고나선 그런부분을 짤때 한번더 보게됩니다..

Ultraedit을 사용하는 친구는 괄호의 짝을 굵게 표시해줘서 그런건 안당한다고 하더군요.. ^^;

이클립스 유져들도 =3=33 역시나 흐흐흐흐

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.