]> granicus.if.org Git - clang/commitdiff
[Diagnostics] Silence -Wsizeof-array-div for character buffers
authorJames Clarke <jrtc27@jrtc27.com>
Tue, 8 Oct 2019 11:34:02 +0000 (11:34 +0000)
committerJames Clarke <jrtc27@jrtc27.com>
Tue, 8 Oct 2019 11:34:02 +0000 (11:34 +0000)
Summary:
Character buffers are sometimes used to represent a pool of memory that
contains non-character objects, due to them being synonymous with a stream of
bytes on almost all modern architectures. Often, when interacting with hardware
devices, byte buffers are therefore used as an intermediary and so we can end
Character buffers are sometimes used to represent a pool of memory that
contains non-character objects, due to them being synonymous with a stream of
bytes on almost all modern architectures. Often, when interacting with hardware
devices, byte buffers are therefore used as an intermediary and so we can end
up generating lots of false-positives.

Moreover, due to the ability of character pointers to alias non-character
pointers, the strict aliasing violations that would generally be implied by the
calculations caught by the warning (if the calculation itself is in fact
correct) do not apply here, and so although the length calculation may be
wrong, that is the only possible issue.

Reviewers: rsmith, xbolva00, thakis

Reviewed By: xbolva00, thakis

Subscribers: thakis, lebedev.ri, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D68526

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374035 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/div-sizeof-array.cpp

index f08b616809464ee1dd9aac73c96f09ff6d492ffc..d158eaabde9eaea0d59baab1c1b2e7e376cce592 100644 (file)
@@ -9197,6 +9197,7 @@ static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS,
     QualType ArrayElemTy = ArrayTy->getElementType();
     if (ArrayElemTy != S.Context.getBaseElementType(ArrayTy) ||
         ArrayElemTy->isDependentType() || RHSTy->isDependentType() ||
+        ArrayElemTy->isCharType() ||
         S.Context.getTypeSize(ArrayElemTy) == S.Context.getTypeSize(RHSTy))
       return;
     S.Diag(Loc, diag::warn_division_sizeof_array)
index 7c76a5265b85ea58096965e38a659424f0fc159b..e295a9dec6d889e5e14e069c4478d73d5e18d2af 100644 (file)
@@ -25,6 +25,8 @@ void test(void) {
   int a10 = sizeof(arr3) / sizeof(char);
   int a11 = sizeof(arr2) / (sizeof(unsigned));
   int a12 = sizeof(arr) / (sizeof(short));
+  int a13 = sizeof(arr3) / sizeof(p);
+  int a14 = sizeof(arr3) / sizeof(int);
 
   int arr4[10][12];
   int b1 = sizeof(arr4) / sizeof(arr2[12]);