From 5e2d7a7754ef72f285b0fab0d6f7e8a3fa5459d8 Mon Sep 17 00:00:00 2001
From: Philippe Canal <pcanal@fnal.gov>
Date: Tue, 1 Nov 2011 21:03:41 +0000
Subject: [PATCH] Fix medium impact coverity reports

git-svn-id: http://root.cern.ch/svn/root/trunk@41697 27541ba8-7e3a-0410-8455-c3a389f83636
---
 core/meta/src/TMethodCall.cxx                |  6 ++++--
 core/metautils/inc/TSchemaRuleProcessor.h    |  4 ++--
 core/metautils/src/RConversionRuleParser.cxx |  3 ++-
 core/rint/src/TTabCom.cxx                    |  2 +-
 io/dcache/src/TDCacheFile.cxx                |  2 +-
 io/io/src/TMakeProject.cxx                   |  4 +++-
 io/io/src/TStreamerInfo.cxx                  | 13 +++++++++----
 tree/tree/src/TBranchElement.cxx             |  1 +
 tree/tree/src/TTree.cxx                      |  5 +++--
 tree/tree/src/TTreeSQL.cxx                   | 16 +++++++++++-----
 tree/treeplayer/src/TSelectorDraw.cxx        |  6 ++++--
 tree/treeplayer/src/TSelectorEntries.cxx     |  3 ++-
 12 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/core/meta/src/TMethodCall.cxx b/core/meta/src/TMethodCall.cxx
index 52e7c0e5282..5d2f2ad61c3 100644
--- a/core/meta/src/TMethodCall.cxx
+++ b/core/meta/src/TMethodCall.cxx
@@ -30,6 +30,7 @@
 #include "TROOT.h"
 #include "Strlen.h"
 #include "TVirtualMutex.h"
+#include "TError.h"
 
 ClassImp(TMethodCall)
 
@@ -146,8 +147,9 @@ static TClass *R__FindScope(const char *function, UInt_t &pos, ClassInfo_t *cinf
       UInt_t nested = 0;
       for(int i=strlen(function); i>=0; --i) {
          switch(function[i]) {
-            case '<': --nested; break;
-            case '>': ++nested; break;
+            case '<': ++nested; break;
+            case '>': if (nested==0) { Error("TMethodCall R__FindScope","%s is not well formed function name",function); return 0; }
+                      --nested; break;
             case ':':
                if (nested==0) {
                   if (i>2 && function[i-1]==':') {
diff --git a/core/metautils/inc/TSchemaRuleProcessor.h b/core/metautils/inc/TSchemaRuleProcessor.h
index 6e6596e3360..01dbf587587 100644
--- a/core/metautils/inc/TSchemaRuleProcessor.h
+++ b/core/metautils/inc/TSchemaRuleProcessor.h
@@ -90,8 +90,8 @@ namespace ROOT
                   // Take in consideration template names.
                   for(std::string::size_type j=elem.size(); j>0; --j) {
                      std::string::size_type i = j-1;
-                     if (elem[i]=='<') { --level; }
-                     else if (elem[i]=='>') { ++level; }
+                     if (elem[i]=='<') { ++level; }
+                     else if (elem[i]=='>') { if (level==0) { continue; } ; --level; }
                      else if (level == 0 && isspace(elem[i])) {
                         type = elem.substr( 0, i );
                         // At the first iteration we know we have a space.
diff --git a/core/metautils/src/RConversionRuleParser.cxx b/core/metautils/src/RConversionRuleParser.cxx
index db2a62484bd..b13a12c0fb1 100644
--- a/core/metautils/src/RConversionRuleParser.cxx
+++ b/core/metautils/src/RConversionRuleParser.cxx
@@ -47,7 +47,8 @@ namespace ROOT
                break;
             }
             case '<': ++level; break;
-            case '>': --level; break;
+            case '>': if (level==0) { return std::string::npos; }
+                      --level; break;
             default: {
                // nothing to do
             }
diff --git a/core/rint/src/TTabCom.cxx b/core/rint/src/TTabCom.cxx
index 7d3724a2ac6..21aedd834d0 100644
--- a/core/rint/src/TTabCom.cxx
+++ b/core/rint/src/TTabCom.cxx
@@ -789,7 +789,7 @@ Char_t TTabCom::AllAgreeOnChar(int i, const TSeqCollection * pList,
          // just use the first one.
          next.Reset();
          pObj = next();
-         s = pObj->GetName();
+         if (pObj) s = pObj->GetName();
          break;
       }
    }
diff --git a/io/dcache/src/TDCacheFile.cxx b/io/dcache/src/TDCacheFile.cxx
index 3903cd2b6b3..9002b9668bc 100644
--- a/io/dcache/src/TDCacheFile.cxx
+++ b/io/dcache/src/TDCacheFile.cxx
@@ -286,7 +286,7 @@ Bool_t TDCacheFile::ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf
       total += len[j];
    }
 
-   if ( high / total < 10 ) {
+   if ( total && high / total < 10 ) {
 
       char *temp = new char[high];
       Seek(low);
diff --git a/io/io/src/TMakeProject.cxx b/io/io/src/TMakeProject.cxx
index da393ffdf82..62ee63a07d2 100644
--- a/io/io/src/TMakeProject.cxx
+++ b/io/io/src/TMakeProject.cxx
@@ -229,7 +229,7 @@ UInt_t TMakeProject::GenerateClassPrefix(FILE *fp, const char *clname, Bool_t to
                   ++nest;
                   break;
                case '>':
-                  --nest;
+                  if (nest) --nest;
                   break;
                case ',':
                   if (nest == 1) {
@@ -364,6 +364,7 @@ void TMakeProject::GenerateMissingStreamerInfos(TList *extrainfos, const char *c
             if (nest == 1) last = i + 1;
             break;
          case '>':
+            if (nest == 0) return; // The name is not well formed, give up.
             --nest; /* intentional fall throught to the next case */
          case ',':
             if ((clname[i] == ',' && nest == 1) || (clname[i] == '>' && nest == 0)) {
@@ -443,6 +444,7 @@ UInt_t TMakeProject::GenerateIncludeForTemplate(FILE *fp, const char *clname, ch
             if (nest == 1) last = i + 1;
             break;
          case '>':
+            if (nest==0) return ninc; // the name is not well formed, give up.
             --nest; /* intentional fall throught to the next case */
          case ',':
             if ((clname[i] == ',' && nest == 1) || (clname[i] == '>' && nest == 0)) {
diff --git a/io/io/src/TStreamerInfo.cxx b/io/io/src/TStreamerInfo.cxx
index 18891482b8b..e5c7b17feea 100644
--- a/io/io/src/TStreamerInfo.cxx
+++ b/io/io/src/TStreamerInfo.cxx
@@ -975,7 +975,8 @@ namespace {
       for (UInt_t i = oldlen, done = false, nest = 0; (i>0) && !done ; --i) {
          switch (oldClass->GetName()[i-1]) {
             case '>' : ++nest; break;
-            case '<' : --nest; break;
+            case '<' : if (nest==0) return kFALSE; // the name is not well formed, give up. 
+                       --nest; break;
             case ':' : if (nest == 0) oldname= &(oldClass->GetName()[i]); done = kTRUE; break;
          }
       }
@@ -2600,6 +2601,7 @@ void TStreamerInfo::GenerateDeclaration(FILE *fp, FILE *sfp, const TList *subCla
                isTemplate = kTRUE;
                break;
             case '>':
+               if (nest == 0) { cur = len; continue; } // the name is not well formed, give up.
                --nest;
                break;
             case ':': {
@@ -2996,15 +2998,18 @@ Int_t TStreamerInfo::GenerateHeaderFile(const char *dirname, const TList *subCla
 
    TString sourcename; sourcename.Form( "%s/%sProjectSource.cxx", dirname, gSystem->BaseName(dirname) );
    FILE *sfp = fopen( sourcename.Data(), "a" );
-   GenerateDeclaration(fp, sfp, subClasses);
-   
+   if (sfp) {
+      GenerateDeclaration(fp, sfp, subClasses);
+   } else {
+      Error("GenerateHeaderFile","Could not open %s for appending",sourcename.Data());
+   }
    TMakeProject::GeneratePostDeclaration(fp, this, inclist);
 
    fprintf(fp,"#endif\n");
 
    delete [] inclist;
    fclose(fp);
-   fclose(sfp);
+   if (sfp) fclose(sfp);
    return 1;
 }
 
diff --git a/tree/tree/src/TBranchElement.cxx b/tree/tree/src/TBranchElement.cxx
index de140665910..fd5c0633458 100644
--- a/tree/tree/src/TBranchElement.cxx
+++ b/tree/tree/src/TBranchElement.cxx
@@ -2854,6 +2854,7 @@ void TBranchElement::InitializeOffsets()
                // -- My parent's parent is not a top-level branch.
                // Remove the base class name suffix from the parent name.
                // Note: The pattern is the name of the base class.
+               // coverity[forward_null] branchElem is non zero here since fType==1 and thus fID > -1
                TString pattern(branchElem->GetName());
                if (pattern.Length() <= parentName.Length()) {
                   if (!strcmp(parentName.Data() + (parentName.Length() - pattern.Length()), pattern.Data())) {
diff --git a/tree/tree/src/TTree.cxx b/tree/tree/src/TTree.cxx
index 5e400fcbcdd..9063ad30500 100644
--- a/tree/tree/src/TTree.cxx
+++ b/tree/tree/src/TTree.cxx
@@ -4066,7 +4066,7 @@ Int_t TTree::Fill()
             if (fAutoSave!=0 && fEntries >= fAutoSave) AutoSave();    // FlushBaskets not called in AutoSave
             if (gDebug > 0) Info("TTree::Fill","First AutoFlush.  fAutoFlush = %lld, fAutoSave = %lld\n", fAutoFlush, fAutoSave);
          }
-      } else if (fNClusterRange && (fEntries-fClusterRangeEnd[fNClusterRange-1]) % fAutoFlush) {
+      } else if (fNClusterRange && fAutoFlush && (fEntries-fClusterRangeEnd[fNClusterRange-1]) % fAutoFlush) {
          if (fAutoSave != 0 && fEntries%fAutoSave == 0) {
             //We are at an AutoSave point. AutoSave flushes baskets and saves the Tree header
             AutoSave("flushbaskets");
@@ -4077,7 +4077,7 @@ Int_t TTree::Fill()
             if (gDebug > 0) Info("TTree::Fill","FlushBasket called at entry %lld, fZipBytes=%lld, fFlushedBytes=%lld\n",fEntries,fZipBytes,fFlushedBytes);
          }
          fFlushedBytes = fZipBytes;         
-      } else if (fNClusterRange == 0 && fEntries > 1 && fEntries%fAutoFlush == 0) {
+      } else if (fNClusterRange == 0 && fEntries > 1 && fAutoFlush && fEntries%fAutoFlush == 0) {
          if (fAutoSave != 0 && fEntries%fAutoSave == 0) {
             //We are at an AutoSave point. AutoSave flushes baskets and saves the Tree header
             AutoSave("flushbaskets");
@@ -5900,6 +5900,7 @@ void TTree::OptimizeBaskets(ULong64_t maxMemory, Float_t minComp, Option_t *opti
             branch->SetCompressionSettings(0);
          }
       }
+      // coverity[divide_by_zero] newMemsize can not be zero as there is at least one leaf
       memFactor = Double_t(maxMemory)/Double_t(newMemsize);
       if (memFactor > 100) memFactor = 100;
       Double_t bmin_new = bmin*memFactor;
diff --git a/tree/tree/src/TTreeSQL.cxx b/tree/tree/src/TTreeSQL.cxx
index 850c507fe0b..d5032da34d3 100644
--- a/tree/tree/src/TTreeSQL.cxx
+++ b/tree/tree/src/TTreeSQL.cxx
@@ -257,6 +257,7 @@ Bool_t TTreeSQL::CheckTable(const TString &table) const
 
    if (fServer==0) return kFALSE;
    TSQLResult * tables = fServer->GetTables(fDB.Data(),table);
+   if (!tables) return kFALSE;
    TSQLRow * row = 0;
    while( (row = tables->Next()) ) {
       if(table.CompareTo(row->GetField(0),TString::kIgnoreCase)==0){
@@ -680,7 +681,7 @@ Long64_t  TTreeSQL::GetEntries() const
    if (fServer==0) return GetEntriesFast();
    if (!CheckTable(fTable.Data())) return 0;
 
-   TTreeSQL* thisvar = (TTreeSQL*)this;
+   TTreeSQL* thisvar = const_cast<TTreeSQL*>(this);
 
    // What if the user already started to call GetEntry
    // What about the initial value of fEntries is it really 0?
@@ -691,10 +692,15 @@ Long64_t  TTreeSQL::GetEntries() const
    if (count==0) {
       thisvar->fEntries = 0;
    } else {
-      TString val = count->Next()->GetField(0);
-      Long_t ret;
-      sscanf(val.Data(), "%ld",&(ret) );
-      thisvar->fEntries = ret;
+      TSQLRow * row = count->Next();
+      if (row) {
+         TString val = row->GetField(0);
+         Long_t ret;
+         sscanf(val.Data(), "%ld",&(ret) );
+         thisvar->fEntries = ret;
+      } else {
+         thisvar->fEntries = 0;
+      }
    }
    return fEntries;
 }
diff --git a/tree/treeplayer/src/TSelectorDraw.cxx b/tree/treeplayer/src/TSelectorDraw.cxx
index 93148327a48..9425b635f25 100644
--- a/tree/treeplayer/src/TSelectorDraw.cxx
+++ b/tree/treeplayer/src/TSelectorDraw.cxx
@@ -114,8 +114,10 @@ void TSelectorDraw::Begin(TTree *tree)
    fDimension = 0;
    fAction = 0;
 
-   const char *varexp0   = fInput->FindObject("varexp")->GetTitle();
-   const char *selection = fInput->FindObject("selection")->GetTitle();
+   TObject *obj = fInput->FindObject("varexp");
+   const char *varexp0   = obj ? obj->GetTitle() : "";
+   obj = fInput->FindObject("selection");
+   const char *selection = obj ? obj->GetTitle() : "";
    const char *option    = GetOption();
 
    TString  opt;
diff --git a/tree/treeplayer/src/TSelectorEntries.cxx b/tree/treeplayer/src/TSelectorEntries.cxx
index b4248b0f1be..0abe0983778 100644
--- a/tree/treeplayer/src/TSelectorEntries.cxx
+++ b/tree/treeplayer/src/TSelectorEntries.cxx
@@ -95,7 +95,8 @@ void TSelectorEntries::SlaveBegin(TTree *tree)
 
    SetStatus(0);
    fSelectedRows   = 0;
-   const char *selection = fInput->FindObject("selection")->GetTitle();
+   TObject *selectObj = fInput->FindObject("selection");
+   const char *selection = selectObj ? selectObj->GetTitle() : "";
 
    if (strlen(selection)) {
       fSelect = new TTreeFormula("Selection",selection,fChain);
-- 
GitLab