1. 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) RSS

    • sizeof parse_main_config::_main_config_: 256
      sizeof int: 4
      sizeof std::string: 8
      sizeof QString: 8

      Это с закоменченным полем.
      Может максимальный размер структуры - 256 байт?
      Ответить
      • Я думаю ты бинарную совместимость где-то поломал. Добавляй это поле в конец, а не в начало.

        И еще, ты знаешь, что в 70-74 инициализируются локальные переменные, а не члены класса? )
        Ответить
    • Может, сборка кривая, и где-то прилинковался код, который не знает о новом размере структуры? Сборка всего проекта с нуля производится?

      А так-то смотреть надо, где именно крэшится через Userdump.exe (или что там у вас в винде).
      Ответить
      • Собирал, и даже удалял Makefile'ы, перед пересборкой, иногда такой прием прокатывал.
        Работаю под линем.
        Асм не знаю.
        Ответить
        • А если собирать с включённой оптимизицией (-O2) и дебажной инфой инфой (-g) одновременно, воспроизводится? Так хотя бы по дампу легко будет понять, где упало.
          Ответить
          • Я и без дампа знаю, где упало, в QMainWindow::show() , я уже писал , что при сборке debug ничего не падает.
            из консоли сборки:
            g++ -c -m64 -pipe -std=c++11 -Wextra -O2 -D_REENTRANT -Wall -W -DQT_WEBKIT -DCP1251 -DQT_NO_DEBUG -DQT_TESTLIB_LIB -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I../../src/tsw-client -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtXml -I/usr/include/qt4/Qt3Support -I/usr/include/qt4/QtTest -I/usr/include/qt4 -Itmp/moc -Itmp/ui -I. -o tmp/obj/testserverwindow.o ../../src/tsw-client/testserverwindow.cpp

            а вот линковщик почему-то линкует с опцией О1.

            g++ -m64 -Wl,-O1 -o ../../bin/tsw ... tmp/obj/testserverwindow.o ...
            Ответить
    • попробуй собрать с -fvisibility=hidden
      Ответить

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