1. Си / Говнокод #3017

    +138.8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    #include <unistd.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <string.h>
    
    // grep ^\s*$ file1 file2 ... | wc -l
    
    int main(int argc, const char **argv)
    {
    	int fd[2];
    	pid_t pid;
    	
    	assert(!pipe(fd));
    	assert((pid = fork()) >= 0);
    	
    	if (!pid)
    	{
    		char **newargv;
    		
    		assert(dup2(fd[1], 1) == 1);
    		assert(!close(fd[0]));
    		assert(!close(fd[1]));
    		assert(newargv = malloc((argc + 2) * sizeof(char *)));
    		newargv[0] = "grep";
    		newargv[1] = "^\\s*$";
    		memcpy(newargv + 2, argv + 1, (argc + 1) * sizeof(char *));
    		assert(execvp("grep", newargv) * 0);
    	}
    	
    	assert((pid = fork()) >= 0);
    	
    	if (!pid)
    	{
    		assert(dup2(fd[0], 0) == 0);
    		assert(!close(fd[0]));
    		assert(!close(fd[1]));
    		assert(execlp("wc", "wc", "-l", NULL) * 0);
    	}
    	
    	assert(!close(fd[0]));
    	assert(!close(fd[1]));
    	
    	while (wait(NULL) != -1);
    	return 0;
    }

    Запостил: Butjok, 15 Апреля 2010

    Комментарии (18) RSS

    • Ненавижу ассерты.
      Ответить
    • С каждым ассертом шансы программы дойти до конца уменьшаются в два раза:) Несложный подсчет показывает, что у данной программы они становятся исчезающе малы.
      FAIL!
      Ответить
      • Кстати, не в два раза, ибо вероятнсоть провала крайне мала, иными здесь нельзя использовать равновероятностную модель.
        Это как в анекдоте про динозавра:
        - Девушка, скажие, какова вероятность что вы сейчас на улице увидите динозавра?
        - 50 на 50! Либо увижу, либо нет!
        Ответить
        • Я именно этот анекдот и имел в виду:))))
          Ответить
      • самое интересное начнётся, если откомпилить эту программу с опцией -DNDEBUG
        Ответить
    • шансы этой программы дойти до конца == 0, если компилятор уберет выражения в ассертах. как правило, в релизной сборке так оно и бывает.
      Ответить
    • unix-way, хуле
      Ответить
    • Человек недавно узнал про ассерт, еще не наигрался.
      Ответить
    • Люблю оборачивать свой код в ассерты и run'чить
      Ответить
      • люблю задавать вопрос "А где здесь С++?!"
        Ответить
    • и всё же мучает вопрос... нет не "где здесь С++?", а "Зачем всё это нужно?"
      Ответить
    • канчайте хаить ассерты. это нормальная программа.

      я когда тестированием занимался, это был дежурный стиль для писания тест кейсов. и не только.

      иначе из-за /красивой/ обработки ошибок просто на все времени никогда не хватит. и шансы сделать ошибку в самой обработке ошибок тоже возрастают.

      ЗЫ в программе есть ровно одна ошибка: в начале должно стоять:
      #if defined(NDEBUG)
      # undef NDEBUG
      #endif
      после этого все чики пыки - за исключением пачки (легко фиксуемых) ворнингов.
      Ответить

    Добавить комментарий