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. QT deployed executable crashes on some computers
Forum Updated to NodeBB v4.3 + New Features

QT deployed executable crashes on some computers

Scheduled Pinned Locked Moved Solved General and Desktop
42 Posts 9 Posters 9.9k Views 3 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.
  • fcarneyF Offline
    fcarneyF Offline
    fcarney
    wrote on last edited by fcarney
    #33

    You are getting an exception because you are assigning nullptr to std::string. Assign to

    char* ptr = getenv("notExistEnvVar");
    if(ptr != nullptr)
      notExistEnvVar = ptr;
    

    getenv is not crashing

    Edit:
    or use QString

    QString str = getenv("notExistEnvVar");
    

    C++ is a perfectly valid school of magic.

    JonBJ L 2 Replies Last reply
    2
    • fcarneyF fcarney

      You are getting an exception because you are assigning nullptr to std::string. Assign to

      char* ptr = getenv("notExistEnvVar");
      if(ptr != nullptr)
        notExistEnvVar = ptr;
      

      getenv is not crashing

      Edit:
      or use QString

      QString str = getenv("notExistEnvVar");
      
      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by
      #34

      @fcarney Thank you :)

      1 Reply Last reply
      1
      • JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #35

        For std::string s = nullptr, see https://stackoverflow.com/questions/10771864/assign-a-nullptr-to-a-stdstring-is-safe/10771938. Accepted answer:

        Requires: s shall not be a null pointer.

        Since the standard does not ask the library to throw an exception when this particular requirement is not met, it would appear that passing a null pointer provoked undefined behavior.

        1 Reply Last reply
        2
        • fcarneyF Offline
          fcarneyF Offline
          fcarney
          wrote on last edited by
          #36

          @JonB said in QT deployed executable crashes on some computers:

          undefined

          !!!UNDEFINED!!!
          The end is nigh!

          Good find!

          C++ is a perfectly valid school of magic.

          1 Reply Last reply
          0
          • JonBJ JonB

            @Lati said in QT deployed executable crashes on some computers:

            It is very easy to test by writing a small application.

            char *p = getenv("ProgramXROOT");
            // or
            char *p = getenv("AnythingElseWhichDoesntExist");
            

            won't crash. It will set p to NULL/nullptr.

            If the program continues and does not check for that, assuming that p will not be null, it may crash. That is all @Pablo-J-Rogina and I are saying.

            Pablo J. RoginaP Offline
            Pablo J. RoginaP Offline
            Pablo J. Rogina
            wrote on last edited by
            #37

            @JonB said in QT deployed executable crashes on some computers:

            won't crash. It will set p to NULL/nullptr.

            The problem is not the assignment... the problem comes once you have assigned NULL to the pointer and then you try using it

            Upvote the answer(s) that helped you solve the issue
            Use "Topic Tools" button to mark your post as Solved
            Add screenshots via postimage.org
            Don't ask support requests via chat/PM. Please use the forum so others can benefit from the solution in the future

            1 Reply Last reply
            1
            • fcarneyF fcarney

              You are getting an exception because you are assigning nullptr to std::string. Assign to

              char* ptr = getenv("notExistEnvVar");
              if(ptr != nullptr)
                notExistEnvVar = ptr;
              

              getenv is not crashing

              Edit:
              or use QString

              QString str = getenv("notExistEnvVar");
              
              L Offline
              L Offline
              Lati
              wrote on last edited by Lati
              #38

              @fcarney

              Obviously, the person who wrote the library didn't know this (to be honest, I didn't know it as well, I have never used getenv). And this is how bugs happened, right? :)

              But interesting thing is that there is no sign about the crash and no-one had an idea about it (including me). I would still look at the error somewhere else if I wouldn't test the code on one of the problem computer.

              Anyway, thank you for the clarification.

              JonBJ 1 Reply Last reply
              0
              • L Lati

                @fcarney

                Obviously, the person who wrote the library didn't know this (to be honest, I didn't know it as well, I have never used getenv). And this is how bugs happened, right? :)

                But interesting thing is that there is no sign about the crash and no-one had an idea about it (including me). I would still look at the error somewhere else if I wouldn't test the code on one of the problem computer.

                Anyway, thank you for the clarification.

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #39

                @Lati
                For the record, getenv() has been in the C runtime libraries since the 1970s(!) There has to be a way for it to tell you that the selected environment variable does not exist (without crashing!), and that is of course by returning 0. I and millions of other coders have been using that behaviour ever since :)

                In your case, whoever wrote the code which does not check for that will doubtless have been working in an environment where that ProgramXROOT variable did always exist, and hence never witnessed the unanticipated behaviour.

                OOI, how have you resolved this? Did you actually change that library's code to fix and recompile, or have you just told your end users they must have that environment variable defined?

                jsulmJ L 2 Replies Last reply
                1
                • JonBJ JonB

                  @Lati
                  For the record, getenv() has been in the C runtime libraries since the 1970s(!) There has to be a way for it to tell you that the selected environment variable does not exist (without crashing!), and that is of course by returning 0. I and millions of other coders have been using that behaviour ever since :)

                  In your case, whoever wrote the code which does not check for that will doubtless have been working in an environment where that ProgramXROOT variable did always exist, and hence never witnessed the unanticipated behaviour.

                  OOI, how have you resolved this? Did you actually change that library's code to fix and recompile, or have you just told your end users they must have that environment variable defined?

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #40

                  @JonB @Lati
                  Yes, "man getenv" shows this:
                  "RETURN VALUE
                  The getenv() function returns a pointer to the value in the environment, or NULL if there is no match."
                  It is the responsibility of the caller to check its return value and reacting accordingly...

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  2
                  • JonBJ JonB

                    @Lati
                    For the record, getenv() has been in the C runtime libraries since the 1970s(!) There has to be a way for it to tell you that the selected environment variable does not exist (without crashing!), and that is of course by returning 0. I and millions of other coders have been using that behaviour ever since :)

                    In your case, whoever wrote the code which does not check for that will doubtless have been working in an environment where that ProgramXROOT variable did always exist, and hence never witnessed the unanticipated behaviour.

                    OOI, how have you resolved this? Did you actually change that library's code to fix and recompile, or have you just told your end users they must have that environment variable defined?

                    L Offline
                    L Offline
                    Lati
                    wrote on last edited by Lati
                    #41

                    @JonB I am not one of that millions of coders (or even if I used it, I never had problems).

                    In the code, I replaced the getenv part using _dupenv_s as following (which will be valid with the next release):

                        char* buf = nullptr;
                        size_t sz = 0;
                        if (_dupenv_s(&buf, &sz, "programXROOT") == 0 && buf != nullptr)
                        {
                            programXRootDirectory = buf;
                            free(buf);
                        }
                        else
                        {
                            QMessageBox msgBox;
                            msgBox.setText("Environmental variable is missing!");
                            msgBox.exec();
                        }
                    

                    Actually, after installation of this application, user has to create this environmental variable before starting the application. And seems like all the users have created the variable and there was no issue so far. But if a user would forget about this, it would be nightmare to find out the reason.

                    JonBJ 1 Reply Last reply
                    0
                    • L Lati

                      @JonB I am not one of that millions of coders (or even if I used it, I never had problems).

                      In the code, I replaced the getenv part using _dupenv_s as following (which will be valid with the next release):

                          char* buf = nullptr;
                          size_t sz = 0;
                          if (_dupenv_s(&buf, &sz, "programXROOT") == 0 && buf != nullptr)
                          {
                              programXRootDirectory = buf;
                              free(buf);
                          }
                          else
                          {
                              QMessageBox msgBox;
                              msgBox.setText("Environmental variable is missing!");
                              msgBox.exec();
                          }
                      

                      Actually, after installation of this application, user has to create this environmental variable before starting the application. And seems like all the users have created the variable and there was no issue so far. But if a user would forget about this, it would be nightmare to find out the reason.

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by JonB
                      #42

                      @Lati
                      Again for the record, the _dupenv_s (which btw is MSVC-only) you mention has nothing to do with the issue you are talking about. The extra parameters it takes are to do with copying the value, if found, into your own buffer. If it's not found:

                      If the variable is not found, then buffer is set to NULL, numberOfElements is set to 0, and the return value is 0 because this situation is not considered to be an error condition.

                      So the issue will rear its head again if code later tries to dereference the buf from the &buf passed in. Just as with the return result from getenv().

                      Purely as a by-the-by, I presume you are aware in the code you show (which perhaps is only intended as an example):

                              programXRootDirectory = buf;
                              free(buf);
                      

                      This would not be a good idea --- programXRootDirectory is left pointing to freed memory! You'll get a different error/crash/behaviour if you then dereference that :)

                      1 Reply Last reply
                      2

                      • Login

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