Alexey Tourbin | 1 Oct 03:24
Picon
Favicon
Gravatar

вопрос по языку Си - порядок вычисления операндов

У нас в rpm есть такой код.

lib/depends.h:
   108  typedef /*@abstract@*/ struct availableList_s {
   109  /*@owned@*/ /*@null@*/ struct availablePackage * list;  /*!< Set of packages. */
   110      struct availableIndex index;        /*!< Set of available items. */
   111      int delta;                          /*!< Delta for pkg list reallocation. */
   112      int size;                           /*!< No. of pkgs in list. */
   113      int alloced;                        /*!< No. of pkgs allocated for list. */
   114      int numDirs;                        /*!< No. of directories. */
   115  /*@owned@*/ /*@null@*/ dirInfo dirs;    /*!< Set of directories. */
   116  } * availableList;
...

lib/depends.c:
   213  static /*@exposed@*/ struct availablePackage *
   214  alAddPackage(availableList al,
   215                  Header h, /*@null@*/ /*@dependent@*/ const void * key,
   216                  /*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
   217          /*@modifies al, h @*/
   218  {
   219      HGE_t hge = (HGE_t)headerGetEntryMinMemory;
   220      HFD_t hfd = headerFreeData;
   221      rpmTagType dnt, bnt;
   222      struct availablePackage * p;
   223      rpmRelocation * r;
   224      int i;
   225      int_32 * dirIndexes;
   226      const char ** dirNames;
   227      int numDirs, dirNum;
(Continue reading)

Alexey Tourbin | 1 Oct 06:03
Picon
Favicon
Gravatar

вопрос по языку Си - realloc & bit hacks

lib/depends.c:
   213  static /*@exposed@*/ struct availablePackage *
   214  alAddPackage(availableList al,
   215                  Header h, /*@null@*/ /*@dependent@*/ const void * key,
   216                  /*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
   217          /*@modifies al, h @*/
   218  {
   219      HGE_t hge = (HGE_t)headerGetEntryMinMemory;
   220      HFD_t hfd = headerFreeData;
   221      rpmTagType dnt, bnt;
   222      struct availablePackage * p;
   223      rpmRelocation * r;
   224      int i;
   225      int_32 * dirIndexes;
   226      const char ** dirNames;
   227      int numDirs, dirNum;
   228      int * dirMapping;
   229      struct dirInfo_s dirNeedle;
   230      dirInfo dirMatch;
   231      int first, last, fileNum;
   232      int origNumDirs;
   233      int pkgNum;
   234  
   235      if (al->size == al->alloced) {
   236          al->alloced += al->delta;
   237          al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced);
   238      }

Здесь в последних строках проверяется, достаточно
ли места в массиве
(Continue reading)

Picon

Re: вопрос по языку Си - realloc & bit hacks

2009/10/1 Alexey Tourbin <at <at> altlinux.ru>:
> Первый вопрос -- есть ли смысл таким образом избегать
вызовов realloc.

Первый принцип оптимизации гласит:

1. Don't optimize.

К сожалению, трудно будет объяснить это апстриму. Но
надо попытаться.

--

-- 
AVM
_______________________________________________
Devel mailing list
Devel <at> lists.altlinux.org
https://lists.altlinux.org/mailman/listinfo/devel
Damir Shayhutdinov | 1 Oct 07:00
Favicon

Re: вопрос по языку Си - порядок вычисления операндов

> Теперь посмотрим на вычитание указателей в строках
729-730.  Левый
> операнд вычитания может изменить ts->addedPackages.list, а правым
> операндом является сам ts->addedPackages.list.  Получается,
что этот
> код зависит от порядка вычисления операндов -- а
именно, может
> использоваться либо старое значение ts->addedPackages.list, либо
> уже новое значение.
>
> Воопрос соответствено насколько легален этот код, и
вообще любая
> нетривиальная информация на эту тему.

Сделал тест:

#include <stdio.h>

static int change(int* p)
{
	*p = *p + 1;
	return *p;
}

void main(void)
{
	int a = 100;
	int b = change(&a) - a;
	printf("a=%d, b=%d\n", a, b);
}
(Continue reading)

Kirill A. Shutemov | 1 Oct 07:02
Gravatar

Re: вопрос по языку Си - порядок вычисления операндов

2009/10/1 Alexey Tourbin <at <at> altlinux.ru>:
> У нас в rpm есть такой код.
>
> lib/depends.h:
>   108  typedef /*@abstract@*/ struct availableList_s {
>   109  /*@owned@*/ /*@null@*/ struct availablePackage * list;  /*!< Set of packages. */
>   110      struct availableIndex index;        /*!< Set of available items. */
>   111      int delta;                          /*!< Delta for pkg list reallocation. */
>   112      int size;                           /*!< No. of pkgs in list. */
>   113      int alloced;                        /*!< No. of pkgs allocated for list. */
>   114      int numDirs;                        /*!< No. of directories. */
>   115  /*@owned@*/ /*@null@*/ dirInfo dirs;    /*!< Set of directories. */
>   116  } * availableList;
> ...
>
> lib/depends.c:
>   213  static /*@exposed@*/ struct availablePackage *
>   214  alAddPackage(availableList al,
>   215                  Header h, /*@null@*/ /*@dependent@*/ const void * key,
>   216                  /*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
>   217          /*@modifies al, h @*/
>   218  {
>   219      HGE_t hge = (HGE_t)headerGetEntryMinMemory;
>   220      HFD_t hfd = headerFreeData;
>   221      rpmTagType dnt, bnt;
>   222      struct availablePackage * p;
>   223      rpmRelocation * r;
>   224      int i;
>   225      int_32 * dirIndexes;
>   226      const char ** dirNames;
(Continue reading)

Kirill A. Shutemov | 1 Oct 07:09
Gravatar

Re: вопрос по языку Си - порядок вычисления операндов

2009/10/1 Kirill A. Shutemov <kirill <at> shutemov.name>:
> 2009/10/1 Alexey Tourbin <at <at> altlinux.ru>:
>> У нас в rpm есть такой код.
>>
>> lib/depends.h:
>>   108  typedef /*@abstract@*/ struct availableList_s {
>>   109  /*@owned@*/ /*@null@*/ struct availablePackage * list;  /*!< Set of packages. */
>>   110      struct availableIndex index;        /*!< Set of available items. */
>>   111      int delta;                          /*!< Delta for pkg list reallocation. */
>>   112      int size;                           /*!< No. of pkgs in list. */
>>   113      int alloced;                        /*!< No. of pkgs allocated for list. */
>>   114      int numDirs;                        /*!< No. of directories. */
>>   115  /*@owned@*/ /*@null@*/ dirInfo dirs;    /*!< Set of directories. */
>>   116  } * availableList;
>> ...
>>
>> lib/depends.c:
>>   213  static /*@exposed@*/ struct availablePackage *
>>   214  alAddPackage(availableList al,
>>   215                  Header h, /*@null@*/ /*@dependent@*/ const void * key,
>>   216                  /*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
>>   217          /*@modifies al, h @*/
>>   218  {
>>   219      HGE_t hge = (HGE_t)headerGetEntryMinMemory;
>>   220      HFD_t hfd = headerFreeData;
>>   221      rpmTagType dnt, bnt;
>>   222      struct availablePackage * p;
>>   223      rpmRelocation * r;
>>   224      int i;
>>   225      int_32 * dirIndexes;
(Continue reading)

REAL | 1 Oct 09:49
Picon

MayaVi

Привет!

До сизифа наконец-то добрался MayaVi (пакет называется
Mayavi). Это 
научная 3D-графика (Scientific data 3-dimensional visualizer). Спасибо 
Валерию Пипину, я просто выложил то, что он дал.

До ftp доедет, видимо, завтра около 8:00 по мск. Просьба
сообщать о 
замеченных багах.

--

-- 

REAL aka Евгений Ростовцев, программист ЦНИТ КемГУ
_______________________________________________
Devel mailing list
Devel <at> lists.altlinux.org
https://lists.altlinux.org/mailman/listinfo/devel
Picon
Favicon

Re: вопрос по языку Си - порядок вычисления операндов

Alexey Tourbin wrote:
> У нас в rpm есть такой код.
>
> lib/depends.h:
>    108  typedef /*@abstract@*/ struct availableList_s {
>    109  /*@owned@*/ /*@null@*/ struct availablePackage * list;  /*!< Set of packages. */
>    110      struct availableIndex index;        /*!< Set of available items. */
>    111      int delta;                          /*!< Delta for pkg list reallocation. */
>    112      int size;                           /*!< No. of pkgs in list. */
>    113      int alloced;                        /*!< No. of pkgs allocated for list. */
>    114      int numDirs;                        /*!< No. of directories. */
>    115  /*@owned@*/ /*@null@*/ dirInfo dirs;    /*!< Set of directories. */
>    116  } * availableList;
> ...
>
> lib/depends.c:
>    213  static /*@exposed@*/ struct availablePackage *
>    214  alAddPackage(availableList al,
>    215                  Header h, /*@null@*/ /*@dependent@*/ const void * key,
>    216                  /*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
>    217          /*@modifies al, h @*/
>    218  {
>    219      HGE_t hge = (HGE_t)headerGetEntryMinMemory;
>    220      HFD_t hfd = headerFreeData;
>    221      rpmTagType dnt, bnt;
>    222      struct availablePackage * p;
>    223      rpmRelocation * r;
>    224      int i;
>    225      int_32 * dirIndexes;
>    226      const char ** dirNames;
(Continue reading)

Picon
Favicon

Re: вопрос по языку Си - порядок вычисления операндов


>> Воопрос соответствено насколько легален этот код,
и вообще любая
>> нетривиальная информация на эту тему.
Я считаю, что этот код не рабочий и передаю вам своё
искреннее уважение, 
за обнаружение этой ошибки.
_______________________________________________
Devel mailing list
Devel <at> lists.altlinux.org
https://lists.altlinux.org/mailman/listinfo/devel
Alexey Voinov | 1 Oct 10:50
Picon
Favicon

Re: [JT] Re: Q: [git] Как разбить большой коммит на несколько?

Ivan Fedorov пишет:
>> И что только люди не делают лишь бы emacs не
использовать. :)
>> emacs + magit легко позволяют как объединять, так и разбивать.
>>     
> еслиб оно ещё и с мерзопакостным hg умело работать... :(
http://xtalk.msk.su/~ott/en/writings/emacs-vcs/EmacsMercurial.html
Это если сходу.А при наличии времени magit довольно
легко, думаю,
можно подстроить под hg.

--

-- 
Alexey Voinov

_______________________________________________
Devel mailing list
Devel <at> lists.altlinux.org
https://lists.altlinux.org/mailman/listinfo/devel

Gmane