From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Tue, 11 Feb 2020 21:14:45 +0300 From: "Dmitry V. Levin" To: ALT Devel discussion list Message-ID: <20200211181445.GA11868@altlinux.org> References: <20200129012150.83E7E8440710@gitery.altlinux.org> <45228f59-3529-a3ee-7eb7-67eac012ffda@altlinux.org> <6acb6b5b-d135-7071-f500-3142170aefda@altlinux.org> <20200211140003.GA8818@altlinux.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Subject: Re: [devel] [SCM] packages/apt: heads/rework-dynamic-mmap X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Feb 2020 18:14:46 -0000 Archived-At: List-Archive: List-Post: On Tue, Feb 11, 2020 at 08:05:38PM +0300, Ivan Zakharyaschev wrote: > On Tue, 11 Feb 2020, Ivan Zakharyaschev wrote: > > > On Tue, 11 Feb 2020, Dmitry V. Levin wrote: > > > > > On Tue, Feb 11, 2020 at 04:47:41PM +0300, Ivan Zakharyaschev wrote: > > > [...] > > > > commit e785f0e8636e47a672445e70f2923a5eea566b33 > > > > Author: Ivan Zakharyaschev > > > > Date: Wed Jan 29 04:41:13 2020 +0300 > > > > > > > > use the safer C++-style static_cast instead of a C-style cast (from void*) > > > > > > > > What is happening here: > > > > > > > > Map->RawAllocate() returns the index in an array of bytes (i.e., of char; > > > > no matter whether they are (un)signed); therefore, we cast the base > > > > pointer to the corresponding type, so that the pointer arithmetic > > > > gives a pointer to the beginning of the allocated space. > > > > > > > > We do not want to rely on non-standard void*-arithmetic. > > > > > > We - это кто, и почему они не хотят полагаться на то, что работает? > > > > Да это расширение gcc, которое работает , когда язык C, а когда C++ -- > > запрещено и в gcc. (Я вроде пробовал, и gcc запретил, когда мы в прошлый > > раз обсуждали падение apt-а на e2k.) > > -bash-4.3$ cat charp-arith.cxx > #include > #include > > char buf[] = "foo"; > > int main(const int argc, char ** const argv) > { > char * const begin = &buf[0]; > char * const end = &buf[2]; > const ptrdiff_t diff = end - begin; > printf("%td\n", diff); > } > -bash-4.3$ gcc -Wall -xc charp-arith.cxx && ./a.out; echo $? > 2 > 0 > -bash-4.3$ gcc -Wall charp-arith.cxx && ./a.out; echo $? > 2 > 0 > -bash-4.3$ gcc -Wall -std=gnu++17 charp-arith.cxx && ./a.out; echo $? > 2 > 0 > -bash-4.3$ diff charp-arith.cxx voidp-arith.cxx > 8,9c8,9 > < char * const begin = &buf[0]; > < char * const end = &buf[2]; > --- > > void * const begin = &buf[0]; > > void * const end = &buf[2]; > -bash-4.3$ gcc -Wall -xc voidp-arith.cxx && ./a.out; echo $? > 2 > 0 > -bash-4.3$ gcc -Wall voidp-arith.cxx && ./a.out; echo $? > voidp-arith.cxx: In function ‘int main(int, char**)’: > voidp-arith.cxx:10:32: error: invalid use of ‘void’ > 10 | const ptrdiff_t diff = end - begin; > | ^~~~~ > 1 > -bash-4.3$ gcc -Wall -std=gnu++17 voidp-arith.cxx && ./a.out; echo $? > voidp-arith.cxx: In function ‘int main(int, char**)’: > voidp-arith.cxx:10:32: error: invalid use of ‘void’ > 10 | const ptrdiff_t diff = end - begin; > | ^~~~~ > 1 > -bash-4.3$ gcc -Wall -std=gnu++2a voidp-arith.cxx && ./a.out; echo $? > voidp-arith.cxx: In function ‘int main(int, char**)’: > voidp-arith.cxx:10:32: error: invalid use of ‘void’ > 10 | const ptrdiff_t diff = end - begin; > | ^~~~~ > 1 > -bash-4.3$ Если арифметика с void* в cxx не поддерживается, значит, она не использовалась, и фраза "We do not want to rely on non-standard void*-arithmetic" просто сбивает с толку. C-style cast - это не арифметика с указателями. -- ldv