r243945 - [UB] Fix two cases of UB in copy/pasted code from SmallVector.
Hans Wennborg
hans at chromium.org
Wed Aug 5 11:56:03 PDT 2015
Richard, Chandler asked me about merging this and the other memcpy-ub
patches to 3.7. I'd like to hear what you think.
On the one hand, this doesn't fix a regression from previous releases
and the issue it addresses is probably fairly benign at the moment. On
the other hand, the patches do fix undefined behaviour and look pretty
straight-forward. What do you think?
Thanks,
Hans
On Mon, Aug 3, 2015 at 8:52 PM, Chandler Carruth <chandlerc at gmail.com> wrote:
> Author: chandlerc
> Date: Mon Aug 3 22:52:52 2015
> New Revision: 243945
>
> URL: http://llvm.org/viewvc/llvm-project?rev=243945&view=rev
> Log:
> [UB] Fix two cases of UB in copy/pasted code from SmallVector.
>
> We should really stop copying and pasting code around. =/
>
> Found by UBSan.
>
> Modified:
> cfe/trunk/include/clang/AST/ASTVector.h
> cfe/trunk/include/clang/Analysis/Support/BumpVector.h
>
> Modified: cfe/trunk/include/clang/AST/ASTVector.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTVector.h?rev=243945&r1=243944&r2=243945&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTVector.h (original)
> +++ cfe/trunk/include/clang/AST/ASTVector.h Mon Aug 3 22:52:52 2015
> @@ -384,14 +384,15 @@ void ASTVector<T>::grow(const ASTContext
> T *NewElts = new (C, llvm::alignOf<T>()) T[NewCapacity];
>
> // Copy the elements over.
> - if (std::is_class<T>::value) {
> - std::uninitialized_copy(Begin, End, NewElts);
> - // Destroy the original elements.
> - destroy_range(Begin, End);
> - }
> - else {
> - // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove).
> - memcpy(NewElts, Begin, CurSize * sizeof(T));
> + if (Begin != End) {
> + if (std::is_class<T>::value) {
> + std::uninitialized_copy(Begin, End, NewElts);
> + // Destroy the original elements.
> + destroy_range(Begin, End);
> + } else {
> + // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove).
> + memcpy(NewElts, Begin, CurSize * sizeof(T));
> + }
> }
>
> // ASTContext never frees any memory.
>
> Modified: cfe/trunk/include/clang/Analysis/Support/BumpVector.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Support/BumpVector.h?rev=243945&r1=243944&r2=243945&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/Support/BumpVector.h (original)
> +++ cfe/trunk/include/clang/Analysis/Support/BumpVector.h Mon Aug 3 22:52:52 2015
> @@ -223,14 +223,15 @@ void BumpVector<T>::grow(BumpVectorConte
> T *NewElts = C.getAllocator().template Allocate<T>(NewCapacity);
>
> // Copy the elements over.
> - if (std::is_class<T>::value) {
> - std::uninitialized_copy(Begin, End, NewElts);
> - // Destroy the original elements.
> - destroy_range(Begin, End);
> - }
> - else {
> - // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove).
> - memcpy(NewElts, Begin, CurSize * sizeof(T));
> + if (Begin != End) {
> + if (std::is_class<T>::value) {
> + std::uninitialized_copy(Begin, End, NewElts);
> + // Destroy the original elements.
> + destroy_range(Begin, End);
> + } else {
> + // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove).
> + memcpy(NewElts, Begin, CurSize * sizeof(T));
> + }
> }
More information about the cfe-commits
mailing list