Hello,

Here are a few changes that try to address some logic error bugs
reported by running scan-build over the Clang code base.

I have no background in compiler technology and I may have been trying
to fix false positives; here is a quick overview of what scan-build
reported, let me know if the fixes are relevant:

Bug Group: Logic error
Bug Type: Called C++ object pointer is null
Files: lib/Driver/Tools.cpp
    
Bug Group: Logic error
Bug Type: Called C++ object pointer is null
Files: lib/Sema/SemaInit.cpp

Bug Group: API
Bug Type: Argument with 'nonnull' attribute passed null
Files: lib/AST/NestedNameSpecifier.cpp

Cheers.
-- 
        Apelete
diff --git a/lib/AST/NestedNameSpecifier.cpp b/lib/AST/NestedNameSpecifier.cpp
index ede3862..a3b1076 100644
--- a/lib/AST/NestedNameSpecifier.cpp
+++ b/lib/AST/NestedNameSpecifier.cpp
@@ -456,9 +456,11 @@ namespace {
       Buffer = NewBuffer;
       BufferCapacity = NewCapacity;
     }
-    
-    memcpy(Buffer + BufferSize, Start, End - Start);
-    BufferSize += End-Start;
+
+    if (Buffer) {
+      memcpy(Buffer + BufferSize, Start, End - Start);
+      BufferSize += End-Start;
+    }
   }
   
   /// \brief Save a source location to the given buffer.
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 824ee72..2ac5416 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -2334,7 +2334,7 @@ static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
     success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
                                                   Args, Features);
 
-  if (!success)
+  if (!success && A)
     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
 
   if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index bd8522d..dc4e967 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -4860,6 +4860,8 @@ static bool tryObjCWritebackConversion(Sema &S,
                                        InitializationSequence &Sequence,
                                        const InitializedEntity &Entity,
                                        Expr *Initializer) {
+  assert(Initializer && "Initializer needs to be not NULL");
+
   bool ArrayDecay = false;
   QualType ArgType = Initializer->getType();
   QualType ArgPointee;
@@ -5235,11 +5237,11 @@ void InitializationSequence::InitializeFrom(Sema &S,
     DeclAccessPair dap;
     if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) {
       AddZeroInitializationStep(Entity.getType());
-    } else if (Initializer->getType() == Context.OverloadTy &&
+    } else if (Initializer && Initializer->getType() == Context.OverloadTy &&
                !S.ResolveAddressOfOverloadedFunction(Initializer, DestType,
                                                      false, dap))
       SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
-    else if (Initializer->getType()->isFunctionType() &&
+    else if (Initializer && Initializer->getType()->isFunctionType() &&
              isExprAnUnaddressableFunction(S, Initializer))
       SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction);
     else
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to