Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Feb 2023 23:29:52 +0100
From:      Steffen Nurpmeso <steffen@sdaoden.eu>
To:        Ed Maste <emaste@freebsd.org>
Cc:        src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org
Subject:   Re: git: 2c709ee70ade - main - libc: handle zero alignment in memalign()
Message-ID:  <20230225222952.t3oH3%steffen@sdaoden.eu>
In-Reply-To: <CAPyFy2A-dnbrivwZiFoJv4sYL9qyXvoZX2SK-bcd9pEdf30qQg@mail.gmail.com>
References:  <202302241821.31OIL4ux075893@gitrepo.freebsd.org> <20230224205001.Fbn1A%steffen@sdaoden.eu> <CAPyFy2D3T6AtK-TYU2HZ9R8QvemC%2B_2pZ52vqANoPOtHhnyuiw@mail.gmail.com> <20230225012736.PT3cH%steffen@sdaoden.eu> <CAPyFy2A-dnbrivwZiFoJv4sYL9qyXvoZX2SK-bcd9pEdf30qQg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Ed Maste wrote in
 <CAPyFy2A-dnbrivwZiFoJv4sYL9qyXvoZX2SK-bcd9pEdf30qQg@mail.gmail.com>:
 |On Fri, 24 Feb 2023 at 20:27, Steffen Nurpmeso <steffen@sdaoden.eu> wrote:
 |> Me too.  'Was just thinking of allocators which give back valid
 |> but inaccessible memory for 0 bytes so that each access would
 |> fault.
 |
 |The size is not (necessarily) zero though. The alignment requested is.

I personally would fail EINVAL for 0: something really must be
bogus if you reqest an alignment of 0.  The standard says

  Upon successful completion, posix_memalign( ) shall return zero;
  otherwise, an error number shall be returned to indicate the error
  and the contents of memptr shall either be left unmodified or be
  set to a null pointer.

  If size is 0, either:
  .   posix_memalign( ) shall not attempt to allocate any space, in
      which case either an implementation-defined error number shall
      be returned, or zero shall be returned with a null pointer
      returned in memptr, or
  .   posix_memalign( ) shall attempt to allocate some space and, if
      the allocation succeeds, zero shall be returned and a pointer
      to the allocated space shall be returned in memptr. The
      application shall ensure that the pointer is not used to
      access an object.

The latter is hard (expensive, special-cased) to implement (here).
Also the claim of the commit message was wrong:

  The address of the allocated memory will be a multiple of
  alignment, which must be a power of two and a multiple of
  sizeof(void *).

As can be seen:

  #?0|kent:tmp$ cat t.c; for i in $(seq 8); do tcc -run t.c $i;echo $?;done
  #include <errno.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  int main(int argc, char **argv){
          char *vp;
          int err;
          if(!(err = posix_memalign((void**)&vp, atoi(argv[1]), 1))){
                  if(vp)
                          *vp = '\0';
                  else
                          printf("x1\n");
          }else
                          printf("x2: %s\n",strerror(err));
          return err != 0;
  }
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  x2: Invalid argument
  1
  0

On the other "size" is ok:

  #?0|kent:tmp$ cat t.c; for i in $(seq 0 2); do tcc -run t.c $i;echo $?;done
  #include <errno.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  int main(int argc, char **argv){
          char *vp;
          int err;
          if(!(err = posix_memalign((void**)&vp, 8, atoi(argv[1])))){
                  if(vp)
                          *vp = '\0';
                  else
                          printf("x1\n");
          }else
                          printf("x2: %s\n",strerror(err));
          return err != 0;
  }
  0
  0

Yet it is not because *vp is accessible, contradicting the
standard -- no?

(Exaggerating a bit, but the last two weeks for me and GNU:
iconv(3) is special for ILSEQ on output [non-conforming],
sysconf(3) PROCESSORS_ONLN is wrong in cgroup
[echo 1-3 > /sys/fs/cgroup/NAME/cpuset.cpus], causing
over-thread-usage in programs like xz and zstd [seems wrong and
implementation-specific non-conforming], whereas those using
nproc(1) are right, and now posix_memalign().)

Ciao, and a nice Sunday everone (who can)!

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20230225222952.t3oH3%steffen>