[libcxx-commits] [PATCH] D150044: [libc++][print] Adds FILE functions.

Tom Honermann via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Aug 24 06:46:45 PDT 2023


tahonermann added inline comments.


================
Comment at: libcxx/test/libcxx/input.output/iostream.format/print.fun/vprint_unicode_posix.pass.cpp:40
+
+  FILE* file = fmemopen(buffer.data(), buffer.size(), "wb");
+  assert(file);
----------------
uabelho wrote:
> When I run this testcase the assert on line 48 below fails for me, and it seems to be because the "fmemopen" call here writes '\0' at the first byte in buffer.
> 
> I really doen't know anything about this and if I read at 
>  https://man7.org/linux/man-pages/man3/fmemopen.3.html
> it says
> ```
>        w      The stream is opened for writing.
> ```
> and also
> ```
>        w+     Open the stream for reading and writing.  The buffer
>               contents are truncated (i.e., '\0' is placed in the first
>               byte of the buffer).
> ```
> So it seems like when I run this in my environment "w" partly does what "w+" should do.
> 
> Does this problem sound familiar to anyone?
Are you by chance using an old glibc version from 2015 or earlier? Early implementations of `fmemopen()` unconditionally truncated the buffer when opened for write. This was changed in this commit:

  - https://github.com/bminor/glibc/commit/fdb7d390dd0d96e4a8239c46f3aa64598b90842b#diff-d190e07e0c146d56444d64c78bb49f4764974719ed454e0254644e1a7b793803L239

Alternatively, the "old" implementation replaced by the commit above is still present in current glibc releases under the name `__old_fmemopen`. Perhaps your builds are somehow calling that implementation?

  - https://github.com/bminor/glibc/blob/master/libio/oldfmemopen.c


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150044/new/

https://reviews.llvm.org/D150044



More information about the libcxx-commits mailing list