1. C++ / Говнокод #23340

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #ifdef _MSC_VER
    #  if ( _MSC_VER <= 1800) // MSVC 2012 / 2013
    typedef std::vector<char>& vector_ref;
    #  else
    typedef std::vector<char>&& vector_ref;
    #  endif
    #else
    typedef std::vector<char>&& vector_ref;
    #endif
    
    auto func = std::bind([this](vector_ref v) { /* ... */ }, std::placeholders::_1);

    тут говна вагон и маленькая тележка
    Во-первых, версии студии, компилятора студии и _MSC_VER всегда разные. Сложно даже представить человека который решил "а давайте распространять компилятор по версии SDK, а проверять по левому числу, не являющемуся ни тем ни другим?"
    Во-вторых, поддержка c++11 в msvc 2012/2013 удручает. В 2012 нет даже type aliases, потому и typedef.
    В-третьих, кривая реализация bind (rvalue-версия не соберется в студиях 12/13, lvalue - в более поздних).

    Antervis, 11 Сентября 2017

    Комментарии (12)
  2. C++ / Говнокод #23305

    +2

    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
    void Assembler::divsd(XMMRegister dst, Address src) {
      NOT_LP64(assert(VM_Version::supports_sse2(), ""));
      InstructionMark im(this);
      simd_prefix(dst, dst, src, VEX_SIMD_F2);
      emit_byte(0x5E);
      emit_operand(dst, src);
    }
    
    void Assembler::divsd(XMMRegister dst, XMMRegister src) {
      NOT_LP64(assert(VM_Version::supports_sse2(), ""));
      int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2);
      emit_byte(0x5E);
      emit_byte(0xC0 | encode);
    }
    
    void Assembler::divss(XMMRegister dst, Address src) {
      NOT_LP64(assert(VM_Version::supports_sse(), ""));
      InstructionMark im(this);
      simd_prefix(dst, dst, src, VEX_SIMD_F3);
      emit_byte(0x5E);
      emit_operand(dst, src);
    }
    
    void Assembler::divss(XMMRegister dst, XMMRegister src) {
      NOT_LP64(assert(VM_Version::supports_sse(), ""));
      int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3);
      emit_byte(0x5E);
      emit_byte(0xC0 | encode);
    }
    
    void Assembler::emms() {
      NOT_LP64(assert(VM_Version::supports_mmx(), ""));
      emit_byte(0x0F);
      emit_byte(0x77);
    }
    
    void Assembler::hlt() {
      emit_byte(0xF4);
    }
    
    void Assembler::idivl(Register src) {
      int encode = prefix_and_encode(src->encoding());
      emit_byte(0xF7);
      emit_byte(0xF8 | encode);
    }

    https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/cpu/x86/vm/assembler_x86.cpp

    Вот эта вот вся ерунда отвечает в Hotspot JVM за генерацию опкодов (чтоб JIT делать). Вы возможно спросите "а где тут говно, j123123?".
    Отвечаю: говно тут на фундаментальном уровне. Такой хуйни по-хорошему вообще не надо писать. Надо формально описать вообще все ебучие опкоды жабового байткода, и все машинные инструкции процессора, которые могут быть порождены жабовым JIT-ом, и потом математически доказать эквивалентность всей этой трансформации какой-нибудь логикой Хоара, системами автоматического доказательства теорем, всякими там Coq, Isabelle и прочей такой сранью, о которой вероятно слышал roman-kashitsyn, раз он там хачкель и Idris с зависимыми типами задрачивал. Ну и CHayT.

    j123123, 29 Августа 2017

    Комментарии (60)
  3. C++ / Говнокод #23304

    0

    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
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    namespace parse_main_config {
    
        struct _main_config_ {
            std::string m_sCurrentConfigFile;
            std::string m_sBaseFile;
            std::string m_sBasePrefix;
            std::string m_sCheckRuleFile;
            std::string m_sReplacementTablesFile;
            std::string m_sPasswdFile;
            std::string m_sTestsListFile;
            std::string m_sModesFile;
            std::string m_sIfacesFile;
            std::string m_sCmcCheckFile;
            std::string m_sUpsCheckFile;
            std::string m_sSetLocalIpFile;
            std::string m_sShortLogFile;
            std::string m_sFullLogFile;
            std::string m_sListLogFile;
    
    	int m_iNTPTime;
    	int m_iNTPOffset;
    	int m_iMonNumber;
            int m_iOSRebootTime;
            int m_iMonitorCount;
            QString m_sStationType;
            int m_iHddTimeout;
            std::string m_sWinIconFile;
            std::string m_sWinMenuOptFile;
            std::string m_sWinMenuCloseFile;
            std::string m_sWindowTitle;
    
            QString m_sServerIP;
            QString m_sServerNetMask;
            QString m_sServerNetIP;
            int m_iPort;
            int m_iTimeout;
    		// Remote work
            std::string m_sRemoteHost;
    		std::string m_sRemoteUser;
    		std::string m_sRemotePass;
    		std::string m_sRemoteFtpUser;
    		std::string m_sRemoteFtpPass;
    
            // defaults
            _main_config_() {
                m_sCurrentConfigFile    = "";
                m_sBaseFile             = "./base.cfg";
                m_sBasePrefix           = "Workstation";
                m_sCheckRuleFile        = "./check_rules.cfg";
                m_sModesFile            = "./view_modes.cfg";
                m_sIfacesFile           = "./ip.cfg";
                m_sReplacementTablesFile = "./replacement_tables.xml";
                m_sShortLogFile         = "./short.log";
                m_sFullLogFile          = "./full.log";
                m_sListLogFile          = "./list.log";
                m_sPasswdFile           = "./passwd";
    
                m_iNTPTime              = 0;
                m_iNTPOffset            = 0;
    
                m_sServerNetMask        = "255.255.255.0";
                m_sServerNetIP          = "1.1.1.1";
                m_sServerIP             = "127.0.0.1";
                m_iPort                 = 1;
                m_iTimeout              = 11;
                m_iMonNumber	    = 2;
    
                m_iOSRebootTime         = -1;
    
            std::string m_sRemoteHost = "127.0.0.1";
                    std::string m_sRemoteUser = "blablabla";
                    std::string m_sRemotePass = "blablabla";
    		std::string m_sRemoteFtpUser = "blablabla";
    		std::string m_sRemoteFtpPass = "";
            }
        };
    
        // parsing file
        int read_configuration(const std::string &, _main_config_ &);
    }

    Поддерживаю старый проект. Большой и настолько старый, что написан с использованием Qt3.
    Дело дошло до релиза.
    Соль в том, что я добавил в эту структуру поле с именем - m_sCurrentConfigFile (первое)
    При сборке debug конфигурации все норм, с release конфигурацией - приложение вылет при QMainWindow::show();
    Стоит закомментить это поле и все места, где оно юзается, естественно - как сука, все хорошо.
    Юзается в двух местах - и в обоих случаях к нему просто присваивается строка.
    На тот самый метод -- ну никак не должно влиять.
    Не подскажете, какая сегодня фаза луны?

    OlegUP, 29 Августа 2017

    Комментарии (7)
  4. C++ / Говнокод #23287

    +3

    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
    int main()
    {
    	asm(
    		mov eax, 2
    		mov ebx, eax
    		mul eax
    		add eax, ebx
    		mov ecx, 16
    		mov ebx, 8
    		lea ebx, ptr [ebx * 16 + ecx + 1]
    		mov ptr [ebx], eax
    		add ptr [ebx], eax
    	);
     
    	printf("eax: %d\n", eax.value);
    	printf("mem:145 = %d\n", *(int*) &a_memory[145]);
     
        return 0;
    }

    На тему ассемблера в пхп
    https://ideone.com/XK7ZQd

    cykablyad, 22 Августа 2017

    Комментарии (86)
  5. C++ / Говнокод #23263

    +1

    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
    #if !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
    namespace __detail {
    
    template<typename _Tp, size_t ..._Extra> struct __repeat;
    template<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> {
      typedef __integer_sequence<_Tp,
                               _Np...,
                               sizeof...(_Np) + _Np...,
                               2 * sizeof...(_Np) + _Np...,
                               3 * sizeof...(_Np) + _Np...,
                               4 * sizeof...(_Np) + _Np...,
                               5 * sizeof...(_Np) + _Np...,
                               6 * sizeof...(_Np) + _Np...,
                               7 * sizeof...(_Np) + _Np...,
                               _Extra...> type;
    };
    
    template<size_t _Np> struct __parity;
    template<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
    
    template<> struct __make<0> { typedef __integer_sequence<size_t> type; };
    template<> struct __make<1> { typedef __integer_sequence<size_t, 0> type; };
    template<> struct __make<2> { typedef __integer_sequence<size_t, 0, 1> type; };
    template<> struct __make<3> { typedef __integer_sequence<size_t, 0, 1, 2> type; };
    template<> struct __make<4> { typedef __integer_sequence<size_t, 0, 1, 2, 3> type; };
    template<> struct __make<5> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
    template<> struct __make<6> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
    template<> struct __make<7> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
    
    template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
    template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
    template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
    template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
    template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
    template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
    template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
    template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
    
    } // namespace detail

    Накопипащенная параша из стандартной библиотеки плюсов для clang/llvm, имеющая отношение к реализации integer_sequence и tuple

    https://github.com/llvm-mirror/libcxx/blob/191f075c6fe7440659781f2603088b2df337c06a/include/__tuple#L101-L139

    https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160627/163531.html

    j123123, 14 Августа 2017

    Комментарии (2)
  6. C++ / Говнокод #23257

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    void* createMap() {
        mp = new Map();    //it's a global variable
        return reinterpret_cast<void*> (new Map());
    }

    ooki2day, 10 Августа 2017

    Комментарии (0)
  7. C++ / Говнокод #23241

    +1

    1. 1
    2. 2
    3. 3
    CoolIntf::GetInstance().DoSomething();
    CoolIntf::GetInstance().DoSomethingElse();
    CoolIntf::GetInstance().DoAnything()

    для случая когда GetInstance() не инлайнится, кто-нибудь в крестах какое решение (без ручного введения временной переменной) для такого кода придумал?
    единственное что нашел это вот это: https://stackoverflow.com/a/2279253 .
    потому что "with" слишком общее слово которое в ж не гуглится.

    Dummy00001, 04 Августа 2017

    Комментарии (38)
  8. C++ / Говнокод #23223

    0

    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
    #include <iostream>
    #include <type_traits>
    #include <functional>
    
    template <typename Function, typename... Args>
    auto call(Function function, Args&&... args) {
        return std::move(function)(std::forward<Args>(args)...);
    }
    
    class Foo {
    public:
        void say(int a) const { std::cout << "Foo::say(int a = " << a << ")\n"; }
    };
    
    int main() {
        call(std::mem_fn(&Foo::say), Foo(), 42);
    }

    Ничего особенного. Просто ЙЦУКЕН!!!!111, как оно вообще работает?

    Elvenfighter, 28 Июля 2017

    Комментарии (2)
  9. C++ / Говнокод #23221

    −2

    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
    #include <iostream>
    #include <typeinfo>
    
    class S
    {
    public:
    	S* _next;
    };
    
    int main (int argc, char **argv)
    {
        for (S* sw1 = new S(), sw2 = sw1->_next;;)
    	{
    		std::cout << typeid(sw1).name() << std::endl;  
    		std::cout << typeid(sw2).name() << std::endl;  
    		break;
    	}
    
        return 0;
    }

    какого хрена этот говнокод не хочет скомпилиться :)

    ASD_77, 26 Июля 2017

    Комментарии (23)
  10. C++ / Говнокод #23220

    0

    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
    #include <iostream>
    
    template < typename T >
    struct Static
    {
        T t;
    };
    
    template < typename T >
    struct Test
    {
        static Static<Test<T>> t;
    };
    
    template < typename T >
    Static< Test<T> > Test<T>::t;
    
    int main (int argc, char **argv)
    {
        Test<int> t;
        return 0;
    }

    Попробуйте скопилять этот код на G++ (даю подсказку - Test is fully defined type - потому что static не в ходит в размер структуры)

    ASD_77, 26 Июля 2017

    Комментарии (1)