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

    −48

    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
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    /*
     * mfi_tbolt_adp_reset - For controller reset
     * @regs: MFI register set
     */
    int
    mfi_tbolt_adp_reset(struct mfi_softc *sc)
    {
    	int retry = 0, i = 0;
    	int HostDiag;
    
    	MFI_WRITE4(sc, MFI_WSR, 0xF);
    	MFI_WRITE4(sc, MFI_WSR, 4);
    	MFI_WRITE4(sc, MFI_WSR, 0xB);
    	MFI_WRITE4(sc, MFI_WSR, 2);
    	MFI_WRITE4(sc, MFI_WSR, 7);
    	MFI_WRITE4(sc, MFI_WSR, 0xD);
    
    	for (i = 0; i < 10000; i++) ;
    
    	HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
    
    	while (!( HostDiag & DIAG_WRITE_ENABLE)) {
    		for (i = 0; i < 1000; i++);
    		HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
    		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
    		    "hostdiag=%x\n", retry, HostDiag);
    
    		if (retry++ >= 100)
    			return 1;
    	}
    
    	device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: HostDiag=%x\n", HostDiag);
    
    	MFI_WRITE4(sc, MFI_HDR, (HostDiag | DIAG_RESET_ADAPTER));
    
    	for (i=0; i < 10; i++) {
    		for (i = 0; i < 10000; i++); // <--- двойной говнокод.
    	}
    
    	HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
    	while (HostDiag & DIAG_RESET_ADAPTER) {
    		for (i = 0; i < 1000; i++) ;
    		HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
    		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
    		    "hostdiag=%x\n", retry, HostDiag);
    
    		if (retry++ >= 1000)
    			return 1;
    	}
    	return 0;
    }

    https://svnweb.freebsd.org/base/head/sys/dev/mfi/mfi_tbolt.c?view=markup&pathrev=235016#l 145
    Двойной говнокод. Мало того, что такие задержки на циклах попросту бесполезны, любой нормальный компилятор их выбросит при оптимизации, так там еще и ошибка с переиспользованием переменной i из внешнего цикла во внутреннем

    Запостил: j123123, 19 Февраля 2016

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

    • Это же с хабра! Там только вчера разбирали код ядра PVS-ом, этот кусок тоже там был найден.
      Ответить
      • И что?
        Ответить
      • Могу лишь сказать, что их хваленый анализатор не смог обнаружить сам факт бесполезности таких циклов для организации задержек, а обратил он внимания на них только тогда(и только оттого), когда такие циклы были друг в друга вложены
        Ответить
        • https://habrahabr.ru/company/pvs-studio/blog/277439/#comment_8776389 притом они похоже на полном серьезе считают, что компилятор подобные циклы не выбросит и что таким образом МОЖНО делать задержку. О чем это говорит?
          Ответить
        • > бесполезности
          Да даже если компилятор не выкинет - один фиг непредсказуемая хуета, т.к. частота процессора неизвестна, а число итераций об таймер не откалибровано.
          Ответить
          • комментарий "for controller reset" может говорить как о том, что компилятор не выкинет, так и о том, что частота известна
            Ответить
            • Откуда известна частота? Каким образом компилятор это не выкинет? С каким уровнем оптимизации это собирают вообще? -O0 ? -O1 ?
              Ответить
              • ну так если пишем под конкретный контроллер, то знаем и частоту, и уровень оптимизации
                Ответить
                • По-вашему это такой особый код, который только на вполне конкретном контроллере должен уметь работать? А где вы видели контроллеры с ThunderBolt (чтобы был некий контроллер, на котором крутилась бы ОС FreeBSD и который бы умел в ThunderBolt )? А знаете что это вообще такое? А что такое mfi? Вот https://mfi.apple.com/MFiWeb/getFAQ.action#1-1 .
                  Ответить
            • Да даже если код всё-таки был бы под контроллер - откуда ты знаешь, что компилятор его не выкинет?
              Ответить
              • тестануть просто
                Ответить
                • Нельзя это тестами проверить... Сегодня луна была в знаке Девы, и компилятор решил не выбрасывать цикл...
                  Ответить

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