Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Strange crush

Strange crush

Scheduled Pinned Locked Moved C / C++ / MFC
comhelpquestion
19 Posts 7 Posters 0 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.
  • H Hans Ruck

    I'm using MyStruct* f() like this:

    if (f()) // crushes here, with f returning NULL
    {
    // ...
    }

    MyStruct is an ordinary structure, containing basic types members. If i modify the code above this way:

    f();
    f();
    // ...
    f();
    if (f())
    {
    // ...
    }

    it doesn't crush but in the same place. The error is about illegaly accessing 0x00000000. Do you know what should be wrong here? :confused: rechi

    D Offline
    D Offline
    Daniel Strigl
    wrote on last edited by
    #2

    Realy strange! :wtf: How does the function f() look like? Daniel ;) --------------------------- Never change a running system!

    1 Reply Last reply
    0
    • H Hans Ruck

      I'm using MyStruct* f() like this:

      if (f()) // crushes here, with f returning NULL
      {
      // ...
      }

      MyStruct is an ordinary structure, containing basic types members. If i modify the code above this way:

      f();
      f();
      // ...
      f();
      if (f())
      {
      // ...
      }

      it doesn't crush but in the same place. The error is about illegaly accessing 0x00000000. Do you know what should be wrong here? :confused: rechi

      D Offline
      D Offline
      Daniel Turini
      wrote on last edited by
      #3

      The problem is inside your f() function. Could you show it to us? My latest articles: XOR tricks for RAID data protection Win32 process suspend/resume tool

      1 Reply Last reply
      0
      • H Hans Ruck

        I'm using MyStruct* f() like this:

        if (f()) // crushes here, with f returning NULL
        {
        // ...
        }

        MyStruct is an ordinary structure, containing basic types members. If i modify the code above this way:

        f();
        f();
        // ...
        f();
        if (f())
        {
        // ...
        }

        it doesn't crush but in the same place. The error is about illegaly accessing 0x00000000. Do you know what should be wrong here? :confused: rechi

        R Offline
        R Offline
        Rickard Andersson20
        wrote on last edited by
        #4

        Bogdan Rechi wrote: I'm using MyStruct* f() like this: Do you initalize it to NULL before doing anything with f? Rickard Andersson@Suza Computing C# and C++ programmer from SWEDEN! UIN: 50302279 E-Mail: nikado@pc.nu Speciality: I love C#, ASP.NET and C++!

        1 Reply Last reply
        0
        • H Hans Ruck

          I'm using MyStruct* f() like this:

          if (f()) // crushes here, with f returning NULL
          {
          // ...
          }

          MyStruct is an ordinary structure, containing basic types members. If i modify the code above this way:

          f();
          f();
          // ...
          f();
          if (f())
          {
          // ...
          }

          it doesn't crush but in the same place. The error is about illegaly accessing 0x00000000. Do you know what should be wrong here? :confused: rechi

          H Offline
          H Offline
          Hans Ruck
          wrote on last edited by
          #5

          I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:

          template<class V, class T>
          T* StructFromVector(V *pvect,
          string szName)
          {
          if (!pvect) return FALSE;

          for (V::iterator it=pvect->begin();
          it!=pvect->end(); it++)
          if ((*it)->m_szName==szName)
          return *it;

          return NULL;
          }

          where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures. The real call looks like this:

          if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
          m_vectRights), (char *)bstRight))
          {
          //...
          }

          Please help! If you can... :(( rechi

          S R D 4 Replies Last reply
          0
          • H Hans Ruck

            I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:

            template<class V, class T>
            T* StructFromVector(V *pvect,
            string szName)
            {
            if (!pvect) return FALSE;

            for (V::iterator it=pvect->begin();
            it!=pvect->end(); it++)
            if ((*it)->m_szName==szName)
            return *it;

            return NULL;
            }

            where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures. The real call looks like this:

            if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
            m_vectRights), (char *)bstRight))
            {
            //...
            }

            Please help! If you can... :(( rechi

            S Offline
            S Offline
            Steen Krogsgaard
            wrote on last edited by
            #6

            from you "Hungarian" I'd say bstRight is a bstr, can you really cast it to (char*)? And shouldn't you really cast it to a string? Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

            H 1 Reply Last reply
            0
            • H Hans Ruck

              I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:

              template<class V, class T>
              T* StructFromVector(V *pvect,
              string szName)
              {
              if (!pvect) return FALSE;

              for (V::iterator it=pvect->begin();
              it!=pvect->end(); it++)
              if ((*it)->m_szName==szName)
              return *it;

              return NULL;
              }

              where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures. The real call looks like this:

              if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
              m_vectRights), (char *)bstRight))
              {
              //...
              }

              Please help! If you can... :(( rechi

              R Offline
              R Offline
              Ranjan Banerji
              wrote on last edited by
              #7

              Just a hunch.... You are passing the function a BSTR. What BSTR class are you using? It coud be that you now have two objects pointing to the the same string. 1. The object in your vector and 2. The bstring container. When one goes out of scope it deletes the string. Then when the other goes out of scope it tries to delete or use the string which has just been deleted.

              H 1 Reply Last reply
              0
              • H Hans Ruck

                I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:

                template<class V, class T>
                T* StructFromVector(V *pvect,
                string szName)
                {
                if (!pvect) return FALSE;

                for (V::iterator it=pvect->begin();
                it!=pvect->end(); it++)
                if ((*it)->m_szName==szName)
                return *it;

                return NULL;
                }

                where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures. The real call looks like this:

                if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
                m_vectRights), (char *)bstRight))
                {
                //...
                }

                Please help! If you can... :(( rechi

                D Offline
                D Offline
                Daniel Turini
                wrote on last edited by
                #8

                Bogdan Rechi wrote: (char *)bstRight) This is not safe, and maybe your problem. A NULL BSTR is often used to represent empty strings and std::string's == operator will generate an access violation on "if ((*it)->m_szName==szName)". Don't know if this is your problem, but soon will be :) Use always (char *)_bstr_t(bstRight) or _com_util::ConvertBSTRToString(bstRight) My latest articles: XOR tricks for RAID data protection Win32 process suspend/resume tool

                H 1 Reply Last reply
                0
                • S Steen Krogsgaard

                  from you "Hungarian" I'd say bstRight is a bstr, can you really cast it to (char*)? And shouldn't you really cast it to a string? Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                  H Offline
                  H Offline
                  Hans Ruck
                  wrote on last edited by
                  #9

                  Steen Krogsgaard wrote: bstRight is a bstr Actually, is _bstr_t. But you're right, i could have cast it directly to string. Thanx for observation. Unfortunatelly, it doesn't solve the crush problem... rechi

                  S 1 Reply Last reply
                  0
                  • H Hans Ruck

                    Steen Krogsgaard wrote: bstRight is a bstr Actually, is _bstr_t. But you're right, i could have cast it directly to string. Thanx for observation. Unfortunatelly, it doesn't solve the crush problem... rechi

                    S Offline
                    S Offline
                    Steen Krogsgaard
                    wrote on last edited by
                    #10

                    I'm still not sure you can cast a _bstr_t to a string (at least not using an explicit cast), they have totally different binary representations, but then again, I'm no expert on either. Anyway, how about stepping through your code, especially through the function, and find the offending line? I'm pretty sure it's not in the line calling the function, it must be somewhere within the function. Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                    H 1 Reply Last reply
                    0
                    • H Hans Ruck

                      I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:

                      template<class V, class T>
                      T* StructFromVector(V *pvect,
                      string szName)
                      {
                      if (!pvect) return FALSE;

                      for (V::iterator it=pvect->begin();
                      it!=pvect->end(); it++)
                      if ((*it)->m_szName==szName)
                      return *it;

                      return NULL;
                      }

                      where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures. The real call looks like this:

                      if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
                      m_vectRights), (char *)bstRight))
                      {
                      //...
                      }

                      Please help! If you can... :(( rechi

                      R Offline
                      R Offline
                      Ranjan Banerji
                      wrote on last edited by
                      #11

                      If bstRight is no longer needed try doing: if (!StructFromVector(&(pUser-> m_vectRights), (char *)bstRight.Detach() )){//...}

                      1 Reply Last reply
                      0
                      • R Ranjan Banerji

                        Just a hunch.... You are passing the function a BSTR. What BSTR class are you using? It coud be that you now have two objects pointing to the the same string. 1. The object in your vector and 2. The bstring container. When one goes out of scope it deletes the string. Then when the other goes out of scope it tries to delete or use the string which has just been deleted.

                        H Offline
                        H Offline
                        Hans Ruck
                        wrote on last edited by
                        #12

                        Ranjan Banerji wrote: You are passing the function a BSTR No, i'm passing a string. If you were right, i think it should have crushed on the first call. But if i call it without if (...) it works ok and doesn't crush. rechi

                        1 Reply Last reply
                        0
                        • S Steen Krogsgaard

                          I'm still not sure you can cast a _bstr_t to a string (at least not using an explicit cast), they have totally different binary representations, but then again, I'm no expert on either. Anyway, how about stepping through your code, especially through the function, and find the offending line? I'm pretty sure it's not in the line calling the function, it must be somewhere within the function. Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                          H Offline
                          H Offline
                          Hans Ruck
                          wrote on last edited by
                          #13

                          Steen Krogsgaard wrote: how about stepping through your code I did it before posting here. I even stepped through the assembly lines; they look like this:

                          012DDBCF mov dword ptr [ebp-68h],eax
                          012DDBD2 cmp dword ptr [ebp-68h],0
                          012DDBD6 jne CRolesUsers2::UserHasRight+1C3h (012ddc53)
                          33: {
                          34: for (it=pUser->m_vectRoles.begin(); it!=pUser->m_vectRoles.
                          012DDBD8 mov ecx,dword ptr [ebp-1Ch]

                          It fails on jne when - very intersting! - tries to jump to 012DDBD8 and not to 012ddc53. rechi

                          S 1 Reply Last reply
                          0
                          • D Daniel Turini

                            Bogdan Rechi wrote: (char *)bstRight) This is not safe, and maybe your problem. A NULL BSTR is often used to represent empty strings and std::string's == operator will generate an access violation on "if ((*it)->m_szName==szName)". Don't know if this is your problem, but soon will be :) Use always (char *)_bstr_t(bstRight) or _com_util::ConvertBSTRToString(bstRight) My latest articles: XOR tricks for RAID data protection Win32 process suspend/resume tool

                            H Offline
                            H Offline
                            Hans Ruck
                            wrote on last edited by
                            #14

                            Daniel Turini wrote: Use always (char *)_bstr_t(bstRight) I did. bstRight is _bstr_t... rechi

                            M 1 Reply Last reply
                            0
                            • H Hans Ruck

                              Steen Krogsgaard wrote: how about stepping through your code I did it before posting here. I even stepped through the assembly lines; they look like this:

                              012DDBCF mov dword ptr [ebp-68h],eax
                              012DDBD2 cmp dword ptr [ebp-68h],0
                              012DDBD6 jne CRolesUsers2::UserHasRight+1C3h (012ddc53)
                              33: {
                              34: for (it=pUser->m_vectRoles.begin(); it!=pUser->m_vectRoles.
                              012DDBD8 mov ecx,dword ptr [ebp-1Ch]

                              It fails on jne when - very intersting! - tries to jump to 012DDBD8 and not to 012ddc53. rechi

                              S Offline
                              S Offline
                              Steen Krogsgaard
                              wrote on last edited by
                              #15

                              Ooh, my asm is a little rusty! I don't get this - I assume 012DDBCF to 012DDBD6 is the asm for

                              if (!pvect) return FALSE

                              but from the asm it seems at it is testing the opposite: jne (jump not equal), that is if dword ptr[ebp-68h] != 0 - or am I remembering jne wrong? Anyway, assuming the asm is right, the "jumping" to 012DDBD8 is because the test failed - that is, pvect != NULL. And the access violation comes as line 34 is executed. Try splitting the line into seperate statements (my stl is even worse than my asm, so this may not work):

                              V* vstart = pvect->begin();
                              V* vend = pvect->end();
                              for (V::iterator it= vstart; it!=vend; it++)
                              {
                              ...blablabla

                              gotta go home now, see you tomorrow. Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                              H 1 Reply Last reply
                              0
                              • S Steen Krogsgaard

                                Ooh, my asm is a little rusty! I don't get this - I assume 012DDBCF to 012DDBD6 is the asm for

                                if (!pvect) return FALSE

                                but from the asm it seems at it is testing the opposite: jne (jump not equal), that is if dword ptr[ebp-68h] != 0 - or am I remembering jne wrong? Anyway, assuming the asm is right, the "jumping" to 012DDBD8 is because the test failed - that is, pvect != NULL. And the access violation comes as line 34 is executed. Try splitting the line into seperate statements (my stl is even worse than my asm, so this may not work):

                                V* vstart = pvect->begin();
                                V* vend = pvect->end();
                                for (V::iterator it= vstart; it!=vend; it++)
                                {
                                ...blablabla

                                gotta go home now, see you tomorrow. Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                                H Offline
                                H Offline
                                Hans Ruck
                                wrote on last edited by
                                #16

                                Steen Krogsgaard wrote: my asm is a little rusty And so is mine... :rolleyes: Steen Krogsgaard wrote: I assume 012DDBCF to 012DDBD6 is the asm for... I'm sorry, i have been confusing. It was about if (!StructFromVector<...>(...). So, that assembling occurs after the function call ends! Observation: it only crushes when i try to debug it. If i call it without debugging, everything seems ok but i have logical errors and got to end in the step by step hell. X| rechi

                                S 1 Reply Last reply
                                0
                                • H Hans Ruck

                                  Daniel Turini wrote: Use always (char *)_bstr_t(bstRight) I did. bstRight is _bstr_t... rechi

                                  M Offline
                                  M Offline
                                  Mike Player
                                  wrote on last edited by
                                  #17

                                  BSTR are wide chars. Unless you are compiling in UNICODE this is a very bad cast. Check out WideCharToMultiByte to convert from WCHAR/BSTR to char

                                  H 1 Reply Last reply
                                  0
                                  • M Mike Player

                                    BSTR are wide chars. Unless you are compiling in UNICODE this is a very bad cast. Check out WideCharToMultiByte to convert from WCHAR/BSTR to char

                                    H Offline
                                    H Offline
                                    Hans Ruck
                                    wrote on last edited by
                                    #18

                                    I used _bstr_t. It has a (char *) conversion operator. I've checked MSDN and it is not about UNICODE at all... Please, correct me if i'm wrong. rechi

                                    1 Reply Last reply
                                    0
                                    • H Hans Ruck

                                      Steen Krogsgaard wrote: my asm is a little rusty And so is mine... :rolleyes: Steen Krogsgaard wrote: I assume 012DDBCF to 012DDBD6 is the asm for... I'm sorry, i have been confusing. It was about if (!StructFromVector<...>(...). So, that assembling occurs after the function call ends! Observation: it only crushes when i try to debug it. If i call it without debugging, everything seems ok but i have logical errors and got to end in the step by step hell. X| rechi

                                      S Offline
                                      S Offline
                                      Steen Krogsgaard
                                      wrote on last edited by
                                      #19

                                      This is about your program accessing random memory, so sometimes it will go right, sometimes wrong, so I wouldn't put too much into it only crashing when you debug it. Anyway, if the program crashes after the template function returns there's two possibilites: your return value is garbage, or your parameters are garbage (or produced garbage during cleanup). I still very much suspect your (char*) cast - try moving it out of the if statement and see if the crash-point moves. I would copy/convert the _bstr_t to a string before the function call. Cheers Steen. "To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"

                                      1 Reply Last reply
                                      0
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes


                                      • Login

                                      • Don't have an account? Register

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • World
                                      • Users
                                      • Groups