Re: Memory underrun in util.cpp:5584

Dimitri van Heesch <[email protected]>
Newsgroups gmane.text.doxygen.devel
Message-ID <[email protected]>
On Fri, Oct 21, 2005 at 03:54:21PM +0100, Michael McTernan wrote:
> Hi there,
> 
> I took the doxygen-1.4.4-20050815.tar.gz CVS tarball and ran it under
> valgrind.  I found a byte being accessed before the start of a buffer:
> 
>   // search for trailing empty lines
>   int b=l-1,bi=-1;
>   p=s.data()+b;
>   while (b>=0)
>   {
>     c=*--p;  <------ Can read before s.data
>     if (c==' ' || c=='\t' || c=='\r') b--;
>     else if (c=='\n') bi=b,b--;
>     else break;
>   }
> 
> I think the problem is that --p occurs before the dereference, and so the
> code would be better written as:
> 
>   while (b>=0)
>   {
>     c=*p; 
>     p--;
>     if (c==' ' || c=='\t' || c=='\r') b--;
> 
> This avoids p[-1] being accessed if something like "\n" is in the buffer.
> 
> I've not put it into Bugzilla, but let me know if you would prefer it filed
> there instead.

If you look at version 1.4.5 or later, you'll see the code had been 
changed to:

------------------------------------------------------
  // search for trailing empty lines
  int b=l-1,bi=-1;
  p=s.data()+b;
  while (b>=0)
  {
    c=*p; p--;
    if (c==' ' || c=='\t' || c=='\r') b--;
    else if (c=='\n') bi=b,b--;
    else break;
  } 
------------------------------------------------------

so that's exactly what you are proposing ;-)

Regards,
  Dimitri



-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.