compnerd marked 3 inline comments as done.
compnerd added inline comments.

================
Comment at: clang/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp:92
+    Length = GetFinalPathNameByHandleW(DirectoryHandle, Buffer.data(),
+                                       Buffer.capacity(), 0);
+    Buffer.resize(Length);
----------------
amccarth wrote:
> Using `Buffer.data()` when you've only reserved space is undefined behavior.  
> You should used `resize` instead of `reserve` and then pass the `size` rather 
> than the `capacity`.
> 
> Be aware that, while unlikely, this could still fail.  The directory could 
> have been removed or renamed between calls or the caller could have passed a 
> bad handle to begin with.
Didn't know that about the `reserve`!

Right, that is why most of this is ignoring failures.  The watch will fail and 
terminate everything.


================
Comment at: clang/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp:36
+  alignas(DWORD)
+  CHAR Buffer[4 * (sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * 
sizeof(WCHAR))];
+
----------------
amccarth wrote:
> compnerd wrote:
> > amccarth wrote:
> > > If it were me, I'd probably make this a `std::vector`.
> > > 
> > > * If an off-by-one bug causes an overrun of one WCHAR, you could trash a 
> > > crucial member variable.  On the heap, the damage is less likely to be 
> > > catastrophic.
> > > * You wouldn't need `alignas`.
> > > * I don't think these are created in a tight loop, so the overhead 
> > > doesn't concern me.
> > > 
> > > Also, I'd probably go with a slightly more descriptive name, like 
> > > `Notifications` rather than `Buffer`.
> > The `alignas` is because the documentation states that the buffer should be 
> > DWORD aligned.  It is more for pedantic reasons rather than anything else.  
> > I think that making it a catastrophic failure is a good thing though - it 
> > would catch the error :)  You are correct about the allocation - it is once 
> > per watch.  I'll rename it at least.
> But it's still an arbitrarily-sized buffer in the middle of a class 
> definition.  If you change your mind about how big to make it, it changes the 
> definition of the class.  The buffer is going to be accessed using pointer 
> arithmetic, which is generally dangerous.  Moving the buffer out of the class 
> avoids both of those problems.
> 
> The alignas here is _not_ pedantic, it's essential.  Without it, you could 
> easily have an alignment problem.  But if you used a vector, you'd know that 
> it would always be suitably aligned.
I think that the class size point is what is more convincing to me for 
switching to a `vector`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D88666

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to