Author Topic: rev7176, potential bug  (Read 6628 times)

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 5721
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
rev7176, potential bug
« on: May 30, 2011, 08:04:27 am »
@loaden:
rev7176, you add a function call
Code
                        // After add a variable token, we should skip to semicolon
                        SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
                        m_Str.Clear();

But look at the DoParse() code:
Code
 case ParserConsts::semicolon_chr:
                {
                    m_Str.Clear();
                    m_PointerOrRef.Clear();
                    // Notice: clears the queue "m_EncounteredTypeNamespaces"
                    while (!m_EncounteredTypeNamespaces.empty())
                        m_EncounteredTypeNamespaces.pop();
                    m_TemplateArgument.Clear();
                }
                break;

So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 5721
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: rev7176, potential bug
« Reply #1 on: May 30, 2011, 08:52:08 am »
BTW:
who can explain the logic to detect a "variable" in these code snippet:

Code
                else if (   (peek == ParserConsts::semicolon)
                         || (   (   m_Options.useBuffer
                                 && (peek.GetChar(0) == ParserConsts::opbracket_chr) )
                             && (!m_Str.Contains(ParserConsts::dcolon)) ) )
                {
                    if (   !m_Str.IsEmpty()
                        && (    wxIsalpha(token.GetChar(0))
                            || (token.GetChar(0) == ParserConsts::underscore_chr) ) )
                    {
                        if (m_Options.handleVars)
                        {
                            Token* newToken = DoAddToken(tkVariable, token, m_Tokenizer.GetLineNumber());
                            if (newToken && !m_TemplateArgument.IsEmpty())
                                ResolveTemplateArgs(newToken);
                        }
                        // After add a variable token, we should skip to semicolon
                        SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
                        m_Str.Clear();
                    }
                }
Too hard to understand the logic... :(
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9660
Re: rev7176, potential bug
« Reply #2 on: May 30, 2011, 09:10:14 am »
So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
I had another concern, but did not try (yet):
What about such constructs:
Code
void main(void)
{
  int a,b,c;
  MyClass d,e,f;
}
... will b,c and e,f be skipped?
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: http://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: http://wiki.codeblocks.org/index.php?title=FAQ

Offline Loaden

  • Lives here!
  • ****
  • Posts: 1014
Re: rev7176, potential bug
« Reply #3 on: May 30, 2011, 11:09:33 am »
So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
I had another concern, but did not try (yet):
What about such constructs:
Code
void main(void)
{
  int a,b,c;
  MyClass d,e,f;
}
... will b,c and e,f be skipped?
I think no problem.
This can improve performance.

the a,b,c are local variable.
you can try:

Code
  int a,b,c;
  MyClass d,e,f;


Offline Loaden

  • Lives here!
  • ****
  • Posts: 1014
Re: rev7176, potential bug
« Reply #4 on: May 30, 2011, 11:22:57 am »
@loaden:
rev7176, you add a function call
Code
                        // After add a variable token, we should skip to semicolon
                        SkipToOneOfChars(ParserConsts::semicolonclbrace, true);
                        m_Str.Clear();

But look at the DoParse() code:
Code
 case ParserConsts::semicolon_chr:
                {
                    m_Str.Clear();
                    m_PointerOrRef.Clear();
                    // Notice: clears the queue "m_EncounteredTypeNamespaces"
                    while (!m_EncounteredTypeNamespaces.empty())
                        m_EncounteredTypeNamespaces.pop();
                    m_TemplateArgument.Clear();
                }
                break;

So, if you Get(eat) the semicolon too earlier, you have no change to clear the context.
I see, you are right!
Thanks!