[libcxx-commits] [PATCH] D122257: [libc++] Fix undefined behavior	in `std::filebuf`
    Louis Dionne via Phabricator via libcxx-commits 
    libcxx-commits at lists.llvm.org
       
    Thu Mar 24 15:41:36 PDT 2022
    
    
  
ldionne requested changes to this revision.
ldionne added a comment.
This revision now requires changes to proceed.
Thanks for looking into this! I have some comments, but overall this looks sensible. I don't know this implementation very well, apologies if some of my comments/questions are naive.
================
Comment at: libcxx/include/fstream:428-436
+        ptrdiff_t __ln = 0, __le = 0, __rn = 0, __re = 0;
+        if (__extbufnext_ != nullptr)
+            __ln = __extbufnext_ - __extbuf_;
+        if (__extbufend_ != nullptr)
+            __le = __extbufend_ - __extbuf_;
+        if (__rhs.__extbufnext_ != nullptr)
+            __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
----------------
Suggestion (IMO that makes it clearer because we can see a pattern in how we initialize those):
```
ptrdiff_t __ln = __extbufnext_       ? __extbufnext_ - __extbuf_             : 0;
ptrdiff_t __le = __extbufend_        ? __extbufend_ - __extbuf_              : 0;
ptrdiff_t __rn = __rhs.__extbufnext_ ? __rhs.__extbufnext_ - __rhs.__extbuf_ : 0;
ptrdiff_t __re = __rhs.__extbufend_  ? __rhs.__extbufend_ - __rhs.__extbuf_  : 0;
```
================
Comment at: libcxx/include/fstream:437
+            __re = __rhs.__extbufend_ - __rhs.__extbuf_;
         if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
         {
----------------
I know nothing about this class' implementation and I haven't studied it deeply, but this is basically a small buffer optimization, right?
I'd add comments like this:
```
// *this uses the small buffer, __rhs doesn't
if (...) {
}
// *this doesn't use the small buffer, __rhs does
else if (...) {
}
// *this and __rhs both use the small buffer
else {
}
```
Actually, this makes me think -- aren't we missing the case where neither is using the small buffer?
================
Comment at: libcxx/include/fstream:452
+            char __tmp[sizeof(__extbuf_min_)];
+            _VSTD::memmove(__tmp, __extbuf_min_, sizeof(__extbuf_min_));
+            _VSTD::memmove(__extbuf_min_, __rhs.__extbuf_min_, sizeof(__extbuf_min_));
----------------
We can use `std::` for new code, no need to use `_VSTD::` anymore!
================
Comment at: libcxx/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap_min.pass.cpp:1
+//===----------------------------------------------------------------------===//
+//
----------------
This test seems to have failed on Windows: https://buildkite.com/llvm-project/libcxx-ci/builds/9676#30ce63ab-bc21-4a52-b236-4148667ef48c
================
Comment at: libcxx/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap_min.pass.cpp:11
+
+// template <class charT, class traits = char_traits<charT> >
+// class basic_filebuf
----------------
Can you add a comment explaining what this tests, along with links to the fixed issues?
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122257/new/
https://reviews.llvm.org/D122257
    
    
More information about the libcxx-commits
mailing list