On Thu, Mar 30, 2006 at 02:46:29PM +0400, Stanislav Ievlev wrote:
> +++++++++++++ versionmatch.cc
>   // CNC:2003-11-05 - Patch by ALT-Linux, which ignores the release
>    //                  if it was not provided, and the epoch.
>    string s(A), sc(A);
>    const char *Ab = s.c_str(), *Ac = sc.c_str();
> 
>    for (string::iterator i = s.begin(), k = sc.begin(); i != s.end(); ++i,++k)
>    {
>       if (*i == ':')
>       {
>          Ab = &(*i) + 1;
>          Ac = &(*k) + 1;
>       }
>       else if (*i == '-')
>       {
>          *i = 0;
>          break;
>       }
>    }
> +++++++++++++
> Опять опасные игры с c_str(), компилятор может запросто выделить один и тот 
> же статический буфер и под Ab, и под Ac, в результате последующие хаки на 
> самом деле будут корёжить один и тот же буфер. Если требуется временный буфер 
> для char*, то надо использовать vector, а не string.

Жуть.  Я не понимаю с первого взгляда что делает этот код.

> ++++++++++++ pkgcache.cc 
> pkgCache::Version **pkgCache::DepIterator::AllTargets()
> ++++++++++++
> Уникальный по производительности код (кажется voins уже находил его)
> Сначала бегаем два раза по циклам только для того чтобы вычислить
> какой же размер нужен нам для списка.
> потом ещё раз бегаем два раза по тем же циклам, но уже заполняем-таки
> результирующий список значениями.

Наверное, надо соптимизировать.

> ++++++++++++ rpm/rpmindexfile.cc
> string rpmSinglePkgIndex::ArchiveURI(string File) const
> {
>    char *cwd = getcwd(NULL,0);
>    .....
>    free(cwd);
> }
> ++++++++++++
> Из документации:
> --
> If buf is NULL, the behaviour of getcwd() is undefined.

Ты не дочитал документацию.

The GNU library version of this function also permits you to specify a
null pointer for the BUFFER argument.

> --
> Аналогичный код в string rpmSingleSrcIndex::ArchiveURI(string File) const
> +++++++++++++ rpm/rpmlistparser.cc
>      char **strings = NULL;
> 
>      res = headerGetEntry(header, *sec, &type, (void **)&strings, &count);
>      .....
>      
> +++++++++++++
> Дима, наверное тебе стоит пересмотреть этот кусок, кажется тут теряется 
> память, аналогично в bool rpmListParser::ParseDepends(pkgCache::VerIterator 
> Ver, unsigned int Type)
> Там как-то странно делается освобождение.

Освобождение памяти отсутствует совсем, упоминаний headerFreeData нет.


-- 
ldv

Attachment: pgpVnRGmCF0Yj.pgp
Description: PGP signature

_______________________________________________
Devel-conf mailing list
[email protected]
https://lists.altlinux.org/mailman/listinfo/devel-conf

Ответить