Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. segfault "caused" by unused variable in different class
Forum Updated to NodeBB v4.3 + New Features

segfault "caused" by unused variable in different class

Scheduled Pinned Locked Moved Unsolved General and Desktop
12 Posts 4 Posters 804 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    micha_eleric
    wrote on last edited by micha_eleric
    #1

    i dont get why or how changing a variable in a different class "causes" a segfault, when the variable is not called. makes me wander if it is a symptom of a unrelated issue.

    using linux, Qt Creator, c++,

    void Class2::Print(std::string s)
        {
            m_file << s << '\n' << std::flush;
            std::cout << s << '\n' << std::flush;
        }
    
    std::ofstream m_file;
    m_file.open("Class2OutputFile.txt");
    

    Print() is called 22 times no issue.

    connect(m_ui->pushButton_35, &QPushButton::clicked,this, &Class1::Btn_ABCParam);
    connect(m_ui->pushButton_32, &QPushButton::clicked,this, &Class1::Btn_XYZParam);
    

    "causes" sigfault, but never does anything with

    while(i < m_vPointA.size())
    or 
    while(i < (m_iNewPoint + 1))
    

    debug showed what was crashing program.
    if i push a button that DOES call a function that DOES deal with m_iNewPoint or m_vPointA, then no crash, all works as should.

    Btn_ABCParam and Btn_XYZParam, sends values to Class2, which does nothing with m_iNewPoint nor m_vPointA.

    as long as

    Class1::DisPlayView()
    Class1::PrintLocation()
    Class1::PrintLocationStepMtrPst()
    

    dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

    i am wandering if the real issue is also causing : https://forum.qt.io/topic/142392/dont-know-what-to-call-error-bug-part-of-string-printed-to-file-and-konsole-without-calling-cout-or-std-ofstream-m_file/4

    i have made a new project, and added my code to new project. same error

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Please provide a minimal, compilable example to reproduce your issue - it's impossible to see something from your code fragments...
      Apart from this - unitinitalized variables may contain anything so everything can happen when they are accessed.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      M 1 Reply Last reply
      1
      • Christian EhrlicherC Christian Ehrlicher

        Please provide a minimal, compilable example to reproduce your issue - it's impossible to see something from your code fragments...
        Apart from this - unitinitalized variables may contain anything so everything can happen when they are accessed.

        M Offline
        M Offline
        micha_eleric
        wrote on last edited by micha_eleric
        #3

        @Christian-Ehrlicher said in segfault "caused" by unused variable in different class:

        Please provide a minimal, compilable example to reproduce your issue - it's impossible to see something from your code fragments...
        Apart from this - unitinitalized variables may contain anything so everything can happen when they are accessed.

        the variable ARE NOT accessed, uninitialized or initialized
        to repeat what i already said, variable that is "causing" sigfault, has absolutely nothing to do with the function that sigfault occurs in.

        at first i thought m_iNewPoint was causing the crash, because if i changed m_iNewPoint [which is at minimum initializing] to one less than size of m_vPointA, then there was no crash.

        Class2 has only one function, that tells Class1 to do anything with m_vPointA nor m_iNewPoint. Class2 does not have any functions that call m_vPointA nor m_iNewPoint. Only Class1 can touch m_vPointA or m_iNewPoint.

        The minimum code, would be the whole project.

        anything done in Class1 that uses m_vPointA or m_iNewPoint, doe not "cause" a sigfault.

        It is like putting fuel in a car in mexico, and a house in canada explodes.

        1 Reply Last reply
        0
        • C Offline
          C Offline
          ChrisW67
          wrote on last edited by
          #4

          The moral of the story... don't refuel in Mexico!

          All we can say is that:

          • if executing the two connect() calls causes a segfault then m_ui, m_ui->pushButton_35, and m_ui->pushButton_32 are all candidates for being uninitialised or undefined.
          • if executing whatever is in Class1::Btn_ABCParam() or Class1::Btn_XYZParam() causes the segfault then the problem is there.

          Any other relationship between these two connect() statements and anything else in your post is unclear.

          as long as

          Class1::DisPlayView()
          Class1::PrintLocation()
          Class1::PrintLocationStepMtrPst()

          dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

          This strongly suggests one, some, or all, of these methods runs off the end of a list, attempt out of bounds access of m_vPointA (whatever that object is), or that last element in m_vPointA is invalid or undefined.

          Run your program in the debugger and, when it crashes, copy and paste:

          • the ASSERT or other output from the console
          • the entire stack back trace
          • the lines of code around the first line or your code mentioned in the back trace
          M 2 Replies Last reply
          1
          • C ChrisW67

            The moral of the story... don't refuel in Mexico!

            All we can say is that:

            • if executing the two connect() calls causes a segfault then m_ui, m_ui->pushButton_35, and m_ui->pushButton_32 are all candidates for being uninitialised or undefined.
            • if executing whatever is in Class1::Btn_ABCParam() or Class1::Btn_XYZParam() causes the segfault then the problem is there.

            Any other relationship between these two connect() statements and anything else in your post is unclear.

            as long as

            Class1::DisPlayView()
            Class1::PrintLocation()
            Class1::PrintLocationStepMtrPst()

            dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

            This strongly suggests one, some, or all, of these methods runs off the end of a list, attempt out of bounds access of m_vPointA (whatever that object is), or that last element in m_vPointA is invalid or undefined.

            Run your program in the debugger and, when it crashes, copy and paste:

            • the ASSERT or other output from the console
            • the entire stack back trace
            • the lines of code around the first line or your code mentioned in the back trace
            M Offline
            M Offline
            micha_eleric
            wrote on last edited by micha_eleric
            #5

            @ChrisW67 said in segfault "caused" by unused variable in different class:

            The moral of the story... don't refuel in Mexico!

            All we can say is that:

            • if executing the two connect() calls causes a segfault then m_ui, m_ui->pushButton_35, and m_ui->pushButton_32 are all candidates for being uninitialised or undefined.
            • if executing whatever is in Class1::Btn_ABCParam() or Class1::Btn_XYZParam() causes the segfault then the problem is there.

            this makes sense, but does not explain allowing unrelated code being able to see last element of m_vPointA, that is not called.

            Any other relationship between these two connect() statements and anything else in your post is unclear.

            as long as

            Class1::DisPlayView()
            Class1::PrintLocation()
            Class1::PrintLocationStepMtrPst()

            dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

            there is not relations, other then being in Class1 with the two buttons connects. that is why i did not look at those the two functions that are connected to the two buttons

            This strongly suggests one, some, or all, of these methods runs off the end of a list, attempt out of bounds access of m_vPointA (whatever that object is), or that last element in m_vPointA is invalid or undefined.

            "strongly suggests" but as i said several times, m_iNewPoint is initialized, and m_vPointA is accessed one less than m_vPointA.size(), by different methods, does not "cause" sigfault, but m_iNewPoint == m_vPointA.size() does "cause" sigfault.

            Run your program in the debugger and, when it crashes, copy and paste:

            • the ASSERT or other output from the console
            • the entire stack back trace
            • the lines of code around the first line or your code mentioned in the back trace

            ok

            M 1 Reply Last reply
            0
            • C ChrisW67

              The moral of the story... don't refuel in Mexico!

              All we can say is that:

              • if executing the two connect() calls causes a segfault then m_ui, m_ui->pushButton_35, and m_ui->pushButton_32 are all candidates for being uninitialised or undefined.
              • if executing whatever is in Class1::Btn_ABCParam() or Class1::Btn_XYZParam() causes the segfault then the problem is there.

              Any other relationship between these two connect() statements and anything else in your post is unclear.

              as long as

              Class1::DisPlayView()
              Class1::PrintLocation()
              Class1::PrintLocationStepMtrPst()

              dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

              This strongly suggests one, some, or all, of these methods runs off the end of a list, attempt out of bounds access of m_vPointA (whatever that object is), or that last element in m_vPointA is invalid or undefined.

              Run your program in the debugger and, when it crashes, copy and paste:

              • the ASSERT or other output from the console
              • the entire stack back trace
              • the lines of code around the first line or your code mentioned in the back trace
              M Offline
              M Offline
              micha_eleric
              wrote on last edited by
              #6

              @ChrisW67 said in segfault "caused" by unused variable in different class:

              Run your program in the debugger and, when it crashes, copy and paste:

              • the ASSERT or other output from the console

              nothing

              • the entire stack back trace

              i would like to know where to find stack. dont see a button/tab for stack

              • the lines of code around the first line or your code mentioned in the back trace
              1 Reply Last reply
              0
              • M micha_eleric

                @ChrisW67 said in segfault "caused" by unused variable in different class:

                The moral of the story... don't refuel in Mexico!

                All we can say is that:

                • if executing the two connect() calls causes a segfault then m_ui, m_ui->pushButton_35, and m_ui->pushButton_32 are all candidates for being uninitialised or undefined.
                • if executing whatever is in Class1::Btn_ABCParam() or Class1::Btn_XYZParam() causes the segfault then the problem is there.

                this makes sense, but does not explain allowing unrelated code being able to see last element of m_vPointA, that is not called.

                Any other relationship between these two connect() statements and anything else in your post is unclear.

                as long as

                Class1::DisPlayView()
                Class1::PrintLocation()
                Class1::PrintLocationStepMtrPst()

                dont get to last element of m_vPointA, then Class2::Print() has no issue with (std::string s)

                there is not relations, other then being in Class1 with the two buttons connects. that is why i did not look at those the two functions that are connected to the two buttons

                This strongly suggests one, some, or all, of these methods runs off the end of a list, attempt out of bounds access of m_vPointA (whatever that object is), or that last element in m_vPointA is invalid or undefined.

                "strongly suggests" but as i said several times, m_iNewPoint is initialized, and m_vPointA is accessed one less than m_vPointA.size(), by different methods, does not "cause" sigfault, but m_iNewPoint == m_vPointA.size() does "cause" sigfault.

                Run your program in the debugger and, when it crashes, copy and paste:

                • the ASSERT or other output from the console
                • the entire stack back trace
                • the lines of code around the first line or your code mentioned in the back trace

                ok

                M Offline
                M Offline
                micha_eleric
                wrote on last edited by
                #7

                @ChrisW67 said in segfault "caused" by unused variable in different class:

                i found this. no clue what it is

                        5022 [1]	    {
                0x55842709e972                  f3 0f 1e fa           endbr64
                0x55842709e976  <+    4>        55                    push   %rbp
                0x55842709e977  <+    5>        48 89 e5              mov    %rsp,%rbp
                0x55842709e97a  <+    8>        48 83 ec 10           sub    $0x10,%rsp
                0x55842709e97e  <+   12>        48 89 7d f8           mov    %rdi,-0x8(%rbp)
                0x55842709e982  <+   16>        48 89 75 f0           mov    %rsi,-0x10(%rbp)
                        5023 [1]	        m_file << s << '\n' << std::flush;
                0x55842709e986  <+   20>        48 8b 45 f8           mov    -0x8(%rbp),%rax
                0x55842709e98a  <+   24>        48 8d 50 18           lea    0x18(%rax),%rdx
                0x55842709e98e  <+   28>        48 8b 45 f0           mov    -0x10(%rbp),%rax
                0x55842709e992  <+   32>        48 89 c6              mov    %rax,%rsi
                0x55842709e995  <+   35>        48 89 d7              mov    %rdx,%rdi
                0x55842709e998  <+   38>        e8 f3 3b fd ff        callq  0x558427072590 <_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@plt>
                0x55842709e99d  <+   43>        be 0a 00 00 00        mov    $0xa,%esi
                0x55842709e9a2  <+   48>        48 89 c7              mov    %rax,%rdi
                0x55842709e9a5  <+   51>        e8 96 36 fd ff        callq  0x558427072040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@plt>
                0x55842709e9aa  <+   56>        48 89 c2              mov    %rax,%rdx
                0x55842709e9ad  <+   59>        48 8b 05 0c 46 07 00  mov    0x7460c(%rip),%rax        # 0x558427112fc0
                0x55842709e9b4  <+   66>        48 89 c6              mov    %rax,%rsi
                0x55842709e9b7  <+   69>        48 89 d7              mov    %rdx,%rdi
                0x55842709e9ba  <+   72>        e8 e1 3e fd ff        callq  0x5584270728a0 <_ZNSolsEPFRSoS_E@plt>
                        5024 [1]	        std::cout << s << '\n' << std::flush;
                0x55842709e9bf  <+   77>        48 8b 45 f0           mov    -0x10(%rbp),%rax
                0x55842709e9c3  <+   81>        48 89 c6              mov    %rax,%rsi
                0x55842709e9c6  <+   84>        48 8b 05 9b 45 07 00  mov    0x7459b(%rip),%rax        # 0x558427112f68
                0x55842709e9cd  <+   91>        48 89 c7              mov    %rax,%rdi
                0x55842709e9d0  <+   94>        e8 bb 3b fd ff        callq  0x558427072590 <_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@plt>
                0x55842709e9d5  <+   99>        be 0a 00 00 00        mov    $0xa,%esi
                0x55842709e9da  <+  104>        48 89 c7              mov    %rax,%rdi
                0x55842709e9dd  <+  107>        e8 5e 36 fd ff        callq  0x558427072040 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@plt>
                0x55842709e9e2  <+  112>        48 89 c2              mov    %rax,%rdx
                0x55842709e9e5  <+  115>        48 8b 05 d4 45 07 00  mov    0x745d4(%rip),%rax        # 0x558427112fc0
                0x55842709e9ec  <+  122>        48 89 c6              mov    %rax,%rsi
                0x55842709e9ef  <+  125>        48 89 d7              mov    %rdx,%rdi
                0x55842709e9f2  <+  128>        e8 a9 3e fd ff        callq  0x5584270728a0 <_ZNSolsEPFRSoS_E@plt>
                        5025 [1]	    }
                0x55842709e9f7  <+  133>        90                    nop
                0x55842709e9f8  <+  134>        c9                    leaveq
                0x55842709e9f9  <+  135>        c3                    retq
                
                1 Reply Last reply
                0
                • C Offline
                  C Offline
                  ChrisW67
                  wrote on last edited by ChrisW67
                  #8

                  Ensure you build a debug version of your project:
                  d7adcd74-fa4c-484d-8843-c5905b927de5-image.png
                  then run the program in the debugger:
                  f4ccb422-1c12-4ffe-b1e1-48f5e00a93af-image.png
                  generate the crash:
                  eaae92d5-f3ab-413a-8b91-ed79f810932e-image.png
                  then look at the debugger panes at the bottom of your screen. The left panel is the back trace (yours will be longer). Right-click to copy the text:
                  3a8b1df9-6097-4a4b-81f5-eb464f2cc4c4-image.png

                  Select the top-most line in the back trace that is in your code. There is a panel that shows the variables in scope at the time of the call selected.
                  d8df6d76-ea3e-42fd-ab45-06bd74b464ba-image.png

                  M 1 Reply Last reply
                  0
                  • C ChrisW67

                    Ensure you build a debug version of your project:
                    d7adcd74-fa4c-484d-8843-c5905b927de5-image.png
                    then run the program in the debugger:
                    f4ccb422-1c12-4ffe-b1e1-48f5e00a93af-image.png
                    generate the crash:
                    eaae92d5-f3ab-413a-8b91-ed79f810932e-image.png
                    then look at the debugger panes at the bottom of your screen. The left panel is the back trace (yours will be longer). Right-click to copy the text:
                    3a8b1df9-6097-4a4b-81f5-eb464f2cc4c4-image.png

                    Select the top-most line in the back trace that is in your code. There is a panel that shows the variables in scope at the time of the call selected.
                    d8df6d76-ea3e-42fd-ab45-06bd74b464ba-image.png

                    M Offline
                    M Offline
                    micha_eleric
                    wrote on last edited by
                    #9

                    @ChrisW67 the panel that shows variables, is open by default, and has no title. it says
                    s <not accessible> std::string
                    which is weird, every call to Print(), has a string

                    what was copied to clip board:
                    1 std::ostream::sentry::sentry(std::ostream&) 0x7f5783825f27
                    2 std::basic_ostream<char, std::char_traits<char>>& std::__ostream_insert<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, const char *, long) 0x7f57838266cc
                    3 Class2::Print CControls.cpp 5023 0x55db831e499d
                    4 Class2::CheckABCParam CControls.cpp 39 0x55db831b9036
                    5 Class3::CheckABCParam Class3.cpp 90 0x55db8322a1ce
                    6 Class1::Btn_ABCParam CGUI.cpp 856 0x55db831f9599
                    7 QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (Class1:: *)()>::call(void (Class1:: *)(), Class1 *, void * *) qobjectdefs_impl.h 152 0x55db83228a69
                    8 QtPrivate::FunctionPointer<void (Class1:: *)()>::call<QtPrivate::List<>, void>(void (Class1:: *)(), Class1 *, void * *) qobjectdefs_impl.h 185 0x55db8322879a
                    9 QtPrivate::QSlotObject<void (Class1:: *)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void * *, bool *) qobjectdefs_impl.h 414 0x55db832281c8
                    10 QMetaObject::activate(QObject *, int, int, void * *) 0x7f5783b87328
                    11 QAbstractButton::clicked(bool) 0x7f5784683806
                    12 ?? 0x7f5784683a2e
                    13 ?? 0x7f5784684e73
                    14 QAbstractButton::mouseReleaseEvent(QMouseEvent *) 0x7f5784685035
                    15 QWidget::event(QEvent *) 0x7f57845d12b6
                    16 QApplicationPrivate::notify_helper(QObject *, QEvent *) 0x7f578458ea66
                    17 QApplication::notify(QObject *, QEvent *) 0x7f5784598343
                    18 QCoreApplication::notifyInternal2(QObject *, QEvent *) 0x7f5783b5b80a
                    19 QApplicationPrivate::sendMouseEvent(QWidget *, QMouseEvent *, QWidget *, QWidget *, QWidget * *, QPointer<QWidget>&, bool, bool) 0x7f5784597457
                    20 ?? 0x7f57845ed35d
                    ... <More>

                    it does not explain how changing a variable for a vector, that is not used, is causing a string to be empty, that has nothing to do with the changed variable, nor a vector

                    M 1 Reply Last reply
                    0
                    • M micha_eleric

                      @ChrisW67 the panel that shows variables, is open by default, and has no title. it says
                      s <not accessible> std::string
                      which is weird, every call to Print(), has a string

                      what was copied to clip board:
                      1 std::ostream::sentry::sentry(std::ostream&) 0x7f5783825f27
                      2 std::basic_ostream<char, std::char_traits<char>>& std::__ostream_insert<char, std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, const char *, long) 0x7f57838266cc
                      3 Class2::Print CControls.cpp 5023 0x55db831e499d
                      4 Class2::CheckABCParam CControls.cpp 39 0x55db831b9036
                      5 Class3::CheckABCParam Class3.cpp 90 0x55db8322a1ce
                      6 Class1::Btn_ABCParam CGUI.cpp 856 0x55db831f9599
                      7 QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (Class1:: *)()>::call(void (Class1:: *)(), Class1 *, void * *) qobjectdefs_impl.h 152 0x55db83228a69
                      8 QtPrivate::FunctionPointer<void (Class1:: *)()>::call<QtPrivate::List<>, void>(void (Class1:: *)(), Class1 *, void * *) qobjectdefs_impl.h 185 0x55db8322879a
                      9 QtPrivate::QSlotObject<void (Class1:: *)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void * *, bool *) qobjectdefs_impl.h 414 0x55db832281c8
                      10 QMetaObject::activate(QObject *, int, int, void * *) 0x7f5783b87328
                      11 QAbstractButton::clicked(bool) 0x7f5784683806
                      12 ?? 0x7f5784683a2e
                      13 ?? 0x7f5784684e73
                      14 QAbstractButton::mouseReleaseEvent(QMouseEvent *) 0x7f5784685035
                      15 QWidget::event(QEvent *) 0x7f57845d12b6
                      16 QApplicationPrivate::notify_helper(QObject *, QEvent *) 0x7f578458ea66
                      17 QApplication::notify(QObject *, QEvent *) 0x7f5784598343
                      18 QCoreApplication::notifyInternal2(QObject *, QEvent *) 0x7f5783b5b80a
                      19 QApplicationPrivate::sendMouseEvent(QWidget *, QMouseEvent *, QWidget *, QWidget *, QWidget * *, QPointer<QWidget>&, bool, bool) 0x7f5784597457
                      20 ?? 0x7f57845ed35d
                      ... <More>

                      it does not explain how changing a variable for a vector, that is not used, is causing a string to be empty, that has nothing to do with the changed variable, nor a vector

                      M Offline
                      M Offline
                      micha_eleric
                      wrote on last edited by micha_eleric
                      #10

                      ????????
                      i replace

                      while(i < (m_vPointA.size() - 0))
                      

                      with

                      while(i < (m_vPointA.size() - 1))
                      

                      so i can move on. getting the last value in vectors are not a big deal, what is causing the unrelated segfault, is.

                      got another unrelated segfault at same point by removing

                      m_sState = "stop"
                      

                      , but this time in Class2, which also has absolutely nothing to do with

                      Class2::CheckABCParam()
                      

                      , sending a string to

                      Class2::Print()
                      

                      ???????????????????????????????????????????????????????????
                      remove all 6

                      m_sState = "stop"
                      

                      at same time, it segfaults in unrelated code
                      remove one at a time, run debug, repeat untill all 6 are removed, and it does not????????

                      1 Reply Last reply
                      0
                      • Kent-DorfmanK Offline
                        Kent-DorfmanK Offline
                        Kent-Dorfman
                        wrote on last edited by
                        #11

                        I detect a strong odor of pointer problems.

                        If you meet the AI on the road, kill it.

                        M 1 Reply Last reply
                        0
                        • Kent-DorfmanK Kent-Dorfman

                          I detect a strong odor of pointer problems.

                          M Offline
                          M Offline
                          micha_eleric
                          wrote on last edited by micha_eleric
                          #12

                          @Kent-Dorfman said in segfault "caused" by unused variable in different class:

                          I detect a strong odor of pointer problems.

                          i am getting random segfault at

                          Class2::Print()
                          

                          , but most dont occur everytime. the one involving

                          (m_vPointA.size()
                          

                          is the only one that occurred every time for two days

                          lets go with pointer error. how to track it down?

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved