Browse Source

Issue #135 - Add more printf style format checking

this commit should cover the remaining issues for functions in the system
that are printf-style and vararg

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Jake Smith 14 years ago
parent
commit
af67e3fb28
47 changed files with 142 additions and 145 deletions
  1. 1 1
      common/roxiehelper/roxiehelper.cpp
  2. 1 1
      common/roxiehelper/roxiehelper.hpp
  3. 2 2
      common/roxiehelper/roxiehelper.ipp
  4. 4 4
      dali/dfuXRefLib/dfuxreflib.cpp
  5. 1 1
      dali/remote/daliservix.cpp
  6. 1 1
      dali/rfs/rfs.h
  7. 5 5
      dali/sasha/saxref.cpp
  8. 1 1
      deployment/deploy/deploy.hpp
  9. 1 1
      ecl/eclagent/eclagent.ipp
  10. 1 1
      ecl/hql/hqlerrors.hpp
  11. 5 5
      ecl/hql/hqlgram.hpp
  12. 25 29
      ecl/hql/hqlgram2.cpp
  13. 7 7
      ecl/hql/hqllex.l
  14. 18 18
      ecl/hql/hqlparse.cpp
  15. 2 2
      ecl/hql/hqlutil.cpp
  16. 1 1
      ecl/hql/hqlvalid.hpp
  17. 2 2
      ecl/hql/hqlxmldb.hpp
  18. 4 4
      ecl/hqlcpp/hqlcpp.ipp
  19. 1 1
      ecl/hqlcpp/hqlstmt.hpp
  20. 1 1
      ecl/hthor/hthor.hpp
  21. 1 1
      esp/bindings/bind_ng.hpp
  22. 1 1
      esp/esplib/pqueue.hpp
  23. 2 2
      esp/platform/espcontext.hpp
  24. 1 1
      esp/platform/espp.hpp
  25. 1 1
      esp/platform/sechandler.hpp
  26. 3 2
      esp/scm/esp.ecm
  27. 1 1
      esp/services/ws_dfu/ws_dfuXRefService.cpp
  28. 2 2
      esp/services/ws_smc/ws_smcService.cpp
  29. 2 2
      esp/services/ws_workunits/ws_workunitsService.cpp
  30. 1 1
      esp/tools/soapplus/xmldiff.hpp
  31. 1 1
      esp/tools/wizards/esp_service_wizard/Debug.h
  32. 1 1
      services/winremote/winremote.cpp
  33. 1 1
      system/hrpc/hrpc.ipp
  34. 1 1
      system/jhtree/ctfile.hpp
  35. 2 2
      tools/backupnode/backupnode.cpp
  36. 3 3
      tools/backupnode/backupnode2.cpp
  37. 1 1
      tools/dumpkey/dumpkey.cpp
  38. 1 1
      tools/esdl/esdl.cpp
  39. 5 3
      tools/esdl/esdl_utils.hpp
  40. 1 2
      tools/esdl/esdlcomp.cpp
  41. 3 3
      tools/esdl/esdlcomp.h
  42. 1 1
      tools/hidl/Hidl.cpp
  43. 3 3
      tools/hidl/hidl_utils.hpp
  44. 13 16
      tools/hidl/hidlcomp.cpp
  45. 3 3
      tools/hidl/hidlcomp.h
  46. 2 0
      tools/start-stop-daemon/start-stop-daemon.c
  47. 1 1
      tools/vkey/vkey.cpp

+ 1 - 1
common/roxiehelper/roxiehelper.cpp

@@ -1295,7 +1295,7 @@ public:
             flushCurrent();
         return ret;
     }
-    size32_t printf(int seq, const char *format, ...)
+    size32_t printf(int seq, const char *format, ...) __attribute__((format(printf, 3, 4)))
     { 
         CriticalBlock c(crit);
         va_list args;

+ 1 - 1
common/roxiehelper/roxiehelper.hpp

@@ -143,7 +143,7 @@ public:
     void append(char data) {append(1, &data);}
     void append(const char *data);
     void append(unsigned len, const char *data);
-    void appendf(const char *format, ...);
+    void appendf(const char *format, ...) __attribute__((format(printf, 2, 3)));
     void encodeXML(const char *x, unsigned flags=0, unsigned len=(unsigned)-1, bool utf8=false);
     virtual void flushXML(StringBuffer &current, bool isClosing);
     void flush(bool closing) ;

+ 2 - 2
common/roxiehelper/roxiehelper.ipp

@@ -80,7 +80,7 @@ interface IRoxieContextLogger : extends IContextLogger
     virtual StringBuffer &getLogPrefix(StringBuffer &ret) const = 0;
     virtual bool isIntercepted() const = 0;
     virtual void CTXLOGa(TracingCategory category, const char *prefix, const char *text) const = 0;
-    virtual void CTXLOGae(IException *E, const char *file, unsigned line, const char *prefix, const char *format, ...) const = 0;
+    virtual void CTXLOGae(IException *E, const char *file, unsigned line, const char *prefix, const char *format, ...) const __attribute__((format(printf, 2, 3))) = 0;
     virtual void CTXLOGaeva(IException *E, const char *file, unsigned line, const char *prefix, const char *format, va_list args) const = 0;
     virtual void CTXLOGl(LogItem *) const = 0;
     virtual bool isBlind() const = 0;
@@ -107,7 +107,7 @@ interface IRHLimitedCompareHelper: public IInterface
 
 interface IOrderedOutputSerializer : extends IInterface 
 {
-  virtual size32_t printf(int seq, const char *format, ...) = 0;
+  virtual size32_t printf(int seq, const char *format, ...) __attribute__((format(printf, 3, 4)))= 0;
   virtual size32_t fwrite(int seq, const void * data, size32_t size, size32_t count) = 0;
   virtual void close(int seq, bool nl) = 0;
 };

+ 4 - 4
dali/dfuXRefLib/dfuxreflib.cpp

@@ -106,7 +106,7 @@ typedef MapStringTo<COrphanEntryPtr> COrphanEntryMap;
 
 Owned <IFileIOStream> outfileio;
 
-void outf(const char *fmt, ...)
+void outf(const char *fmt, ...) __attribute__((format(printf, 1, 2)))
 {
     va_list args;
     va_start(args, fmt);
@@ -485,7 +485,7 @@ public:
         return grp;
     }
 
-    void log(const char * format, ...)
+    void log(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -500,7 +500,7 @@ public:
             PROGLOG("%s",line.str());
         }
     }
-    void error(const char *lname,const char * format, ...)
+    void error(const char *lname,const char * format, ...) __attribute__((format(printf, 3, 4)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -524,7 +524,7 @@ public:
         }
     }
 
-    void warn(const char *lname,const char * format, ...)
+    void warn(const char *lname,const char * format, ...) __attribute__((format(printf, 3, 4)))
     {
         CriticalBlock block(logsect);
         va_list args;

+ 1 - 1
dali/remote/daliservix.cpp

@@ -103,7 +103,7 @@ void Log(const char *s)
     sem_post(logsem);
 }
 
-void LogF(const char *fmt, ...)
+void LogF(const char *fmt, ...) __attribute__((format(printf, 1, 2)))
 {
     static char logbuf[1024*16];
     va_list args;

+ 1 - 1
dali/rfs/rfs.h

@@ -103,7 +103,7 @@ public:
     void stop();                                // can be called async to stop server (e.g. from poll)
 
     void setLogFilename(const char *filename);  // set to NULL for no logfile (default is <exename>_<datetime>.log in cur dir)
-    virtual void log(const char *format, ...);
+    virtual void log(const char *format, ...) __attribute__((format(printf, 2, 3)));
     void throwError(int err, const char *errstr, bool fatal=false);     // does not return, if fatal will stop process
     const char *logFilename();
 

+ 5 - 5
dali/sasha/saxref.cpp

@@ -475,7 +475,7 @@ public:
     Owned<IPropertyTree> orphansbranch;
     Owned<IPropertyTree> dirbranch;
 
-    void log(const char * format, ...)
+    void log(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -490,7 +490,7 @@ public:
         }
     }
 
-    void statlog(const char * format, ...)
+    void statlog(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -504,7 +504,7 @@ public:
         }
     }
 
-    void error(const char *lname,const char * format, ...)
+    void error(const char *lname,const char * format, ...) __attribute__((format(printf, 3, 4)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -521,7 +521,7 @@ public:
         ERRLOG("%s: %s",lname,line.str());
     }
 
-    void warn(const char *lname,const char * format, ...)
+    void warn(const char *lname,const char * format, ...) __attribute__((format(printf, 3, 4)))
     {
         CriticalBlock block(logsect);
         va_list args;
@@ -1657,7 +1657,7 @@ public:
         CNewXRefManagerBase::start(updateeclwatch,"SuperFiles");
     }
 
-    void errornotrecent(const char *lname,const char * format, ...)
+    void errornotrecent(const char *lname,const char * format, ...) __attribute__((format(printf, 3, 4)))
     {
         // checks can lock LFN and not recently changed
         CriticalBlock block(logsect);

+ 1 - 1
deployment/deploy/deploy.hpp

@@ -152,7 +152,7 @@ interface IDeploymentCallback : extends IInterface
 {
     virtual void printStatus(IDeployTask* task) = 0;
     virtual void printStatus(StatusType type, const char* processType, const char* comp, 
-        const char* instance, const char* msg=NULL, ...) = 0;
+        const char* instance, const char* msg=NULL, ...) __attribute__((format(printf, 6, 7))) = 0;
     virtual bool onDisconnect(const char* target) = 0;
     virtual bool getAbortStatus() const = 0;
     virtual void setAbortStatus(bool bAbort) = 0;

+ 1 - 1
ecl/eclagent/eclagent.ipp

@@ -524,7 +524,7 @@ public:
     virtual void returnPersistVersion(const char * logicalName, unsigned eclCRC, unsigned __int64 allCRC, bool isFile) { if(workflow) workflow->returnPersistVersion(logicalName, eclCRC, allCRC, isFile); }
 
     virtual void fail(int code, char const * str); 
-    void failv(int code, char const * fmt, ...);
+    void failv(int code, char const * fmt, ...) __attribute__((format(printf, 3, 4)));
     virtual int queryLastFailCode();
     virtual void getLastFailMessage(size32_t & outLen, char * & outStr, const char * tag);
     virtual void getEventName(size32_t & outLen, char * & outStr);

+ 1 - 1
ecl/hql/hqlerrors.hpp

@@ -482,7 +482,7 @@
 #define HQLERR_IncompatibleTypesForField        4101
 #define HQLWRN_CouldNotConstantFoldIf           4514
 
-#define HQLERR_VirtualFieldInTempTable_Text     "Virtual fields are not supported in constant tables - please provide a value"
+#define HQLERR_VirtualFieldInTempTable_Text     "Virtual field %s not supported in constant table - please provide a value"
 #define HQLERR_IncompatiableInitailiser_Text    "Inline DATASET field '%s' cannot be initialized with a list of values"
 #define HQLERR_NoDefaultProvided_Text           "No value or default provided for field %s in inline table"
 #define HQLERR_TooManyInitializers_Text         "Too many initializers (value %s) for inline dataset definition"

+ 5 - 5
ecl/hql/hqlgram.hpp

@@ -558,15 +558,15 @@ public:
 
 // Error handling
     void doReportWarning(int warnNo, const char *msg, const char *filename, int lineno, int column, int pos);
-    void reportError(int errNo, const attribute& a, const char* format, ...);
-    void reportError(int errNo, const ECLlocation & pos, const char* format, ...);
+    void reportError(int errNo, const attribute& a, const char* format, ...) __attribute__((format(printf, 4, 5)));
+    void reportError(int errNo, const ECLlocation & pos, const char* format, ...) __attribute__((format(printf, 4, 5)));
     void reportMacroExpansionPosition(int errNo, HqlLex * lexer, bool isError);
     void reportErrorUnexpectedX(const attribute & errpos, _ATOM unexpected);
 
     // Don't use overloading: va_list is the same as char*!!
     void reportErrorVa(int errNo, const ECLlocation & a, const char* format, va_list args);
     void reportError(int errNo, const char *msg, int lineno, int column, int position=0);
-    void reportWarning(int warnNo, const ECLlocation & pos, const char* format, ...);
+    void reportWarning(int warnNo, const ECLlocation & pos, const char* format, ...) __attribute__((format(printf, 4, 5)));
     void reportWarningVa(int errNo, const attribute& a, const char* format, va_list args);
     void reportWarning(int warnNo, const char *msg, int lineno, int column);
     void addResult(IHqlExpression *query, const attribute& errpos);
@@ -1078,8 +1078,8 @@ class HqlLex
         IXmlScope *ensureTopXmlScope(const YYSTYPE & errpos);
 
         IHqlExpression *lookupSymbol(_ATOM name, const attribute& errpos);
-        void reportError(const YYSTYPE & returnToken, int errNo, const char *format, ...);
-        void reportWarning(const YYSTYPE & returnToken, int warnNo, const char *format, ...);
+        void reportError(const YYSTYPE & returnToken, int errNo, const char *format, ...) __attribute__((format(printf, 4, 5)));
+        void reportWarning(const YYSTYPE & returnToken, int warnNo, const char *format, ...) __attribute__((format(printf, 4, 5)));
 
         void beginNestedHash(unsigned kind) { hashendKinds.append(kind); hashendDepths.append(1); }
         unsigned endNestedHash() { hashendKinds.pop(); return hashendDepths.pop(); }

+ 25 - 29
ecl/hql/hqlgram2.cpp

@@ -1034,7 +1034,7 @@ IHqlExpression * HqlGram::processModuleDefinition(const attribute & errpos)
     catch (IException * e)
     {
         StringBuffer s;
-        reportError(e->errorCode(), errpos, e->errorMessage(s).str());
+        reportError(e->errorCode(), errpos, "%s", e->errorMessage(s).str());
         e->Release();
         newScope.setown(createNullScope());
     }
@@ -1093,7 +1093,7 @@ void HqlGram::processStartTransform(const attribute & errpos)
             msg.append("<none> is given");
         else
             getFriendlyTypeStr(current_type, msg).append(" is given");
-        reportError(ERR_TRANS_RECORDTYPE, errpos,msg.str());
+        reportError(ERR_TRANS_RECORDTYPE, errpos, "%s", msg.str());
         reportError(ERR_PARSER_CANNOTRECOVER,errpos,"Can not recover from previous error(s) - aborting compilation");
 
         abortParsing();
@@ -1239,7 +1239,7 @@ void HqlGram::addAssignment(attribute & target, attribute &source)
                 {
                     StringBuffer msg("Can not assign non-record type ");
                     getFriendlyTypeStr(type, msg).append(" to self");
-                    reportError(ERR_TRANS_ILLASSIGN2SELF, target, msg.str());
+                    reportError(ERR_TRANS_ILLASSIGN2SELF, target, "%s", msg.str());
                 }
         }
     }
@@ -1285,7 +1285,7 @@ void HqlGram::addAssignment(const attribute & errpos, IHqlExpression * targetExp
                 {
                     StringBuffer msg("Can not assign non-record type ");
                     getFriendlyTypeStr(type, msg).append(" to self");
-                    reportError(ERR_TRANS_ILLASSIGN2SELF, errpos, msg.str());
+                    reportError(ERR_TRANS_ILLASSIGN2SELF, errpos, "%s", msg.str());
                 }
         }
     }
@@ -1461,7 +1461,7 @@ void HqlGram::doAddAssignment(IHqlExpression * transform, IHqlExpression * _fiel
         getFriendlyTypeStr(rhsType,msg).append(" to ");
         getFriendlyTypeStr(fldType,msg).append(" (field ");
         getFldName(field,msg).append(")");
-        reportError(ERR_TYPE_INCOMPATIBLE,errpos, msg.str()); 
+        reportError(ERR_TYPE_INCOMPATIBLE,errpos, "%s", msg.str()); 
     }
 
     appendTransformAssign(transform, field, rhs, errpos);
@@ -3201,7 +3201,7 @@ unsigned HqlGram::checkCompatible(ITypeInfo * t1, ITypeInfo * t2, const attribut
         StringBuffer msg("Type mismatch - expected ");
         getFriendlyTypeStr(t1,msg).append(" value, given ");
         getFriendlyTypeStr(t2,msg);
-        reportError(ERR_EXPECTED, ea, msg.str());
+        reportError(ERR_EXPECTED, ea, "%s", msg.str());
     }
 
     return 0;
@@ -4248,7 +4248,7 @@ IHqlExpression * HqlGram::convertPatternToExpression(attribute & text)
     {
         StringBuffer s;
         e->errorMessage(s);
-        reportError(ERR_BAD_PATTERN, text, s.str());
+        reportError(ERR_BAD_PATTERN, text, "%s", s.str());
         e->Release();
     }
     return NULL;
@@ -4460,7 +4460,7 @@ void HqlGram::ensureType(attribute &a, ITypeInfo * type)
             StringBuffer msg("Incompatible types: expected ");
             getFriendlyTypeStr(type, msg).append(", given ");
             getFriendlyTypeStr(expr->queryType(),msg);
-            reportError(ERR_TYPE_INCOMPATIBLE, a, msg.str());
+            reportError(ERR_TYPE_INCOMPATIBLE, a, "%s", msg.str());
         }
         expr = a.getExpr();
         a.setExpr(ensureExprType(expr, type));
@@ -4828,7 +4828,7 @@ void HqlGram::checkCaseForDuplicates(HqlExprArray & exprs, attribute &err)
             StringBuffer s;
             s.append("Duplicate case entry: ");
             toECL(e1, s, false);
-            reportWarning(WRN_DUPLICATECASE, err.pos, s.str());
+            reportWarning(WRN_DUPLICATECASE, err.pos, "%s", s.str());
         }
         else
             e1->setTransformExtraUnlinked(e1);
@@ -4886,7 +4886,7 @@ void HqlGram::checkReal(attribute &a1)
         {
             StringBuffer msg("Type mismatch - Real value expected (");
             getFriendlyTypeStr(t1,msg).append(" was given)");
-            reportError(ERR_TYPEMISMATCH_REAL, a1, msg.str());
+            reportError(ERR_TYPEMISMATCH_REAL, a1, "%s", msg.str());
         }
 
         OwnedHqlExpr value = a1.getExpr();
@@ -4941,7 +4941,7 @@ bool HqlGram::checkString(attribute &a1)
             {
                 StringBuffer msg("Type mismatch - String value expected (");
                 getFriendlyTypeStr(t1, msg).append(" was given)");
-                reportError(ERR_TYPEMISMATCH_STRING, a1, msg.str());
+                reportError(ERR_TYPEMISMATCH_STRING, a1, "%s", msg.str());
                 return false;
             }
         }
@@ -4967,7 +4967,7 @@ bool HqlGram::checkStringOrUnicode(attribute & exprAttr)
 
     StringBuffer msg("Type mismatch - String or unicode value expected (");
     getFriendlyTypeStr(type, msg).append(" was given)");
-    reportError(ERR_TYPEMISMATCH_STRING, exprAttr, msg.str());
+    reportError(ERR_TYPEMISMATCH_STRING, exprAttr, "%s", msg.str());
     return false;
 }
 
@@ -4978,7 +4978,7 @@ void HqlGram::checkIntegerOrString(attribute & a1)
     {
         StringBuffer msg("Type mismatch - Integer or string value expected (");
         getFriendlyTypeStr(t1, msg).append(" was given)");
-        reportError(ERR_TYPEMISMATCH_INTSTRING, a1, msg.str());
+        reportError(ERR_TYPEMISMATCH_INTSTRING, a1, "%s", msg.str());
     }
 }
 
@@ -4993,7 +4993,7 @@ void HqlGram::checkNumeric(attribute &a1)
             msg.append("(");
             getFriendlyTypeStr(t1, msg).append(" was given)");
         }
-        reportError(ERR_TYPEMISMATCH_INTREAL, a1, msg.str());
+        reportError(ERR_TYPEMISMATCH_INTREAL, a1, "%s", msg.str());
         a1.release().setExpr(getSizetConstant(0));
     }
 }
@@ -5010,7 +5010,7 @@ ITypeInfo *HqlGram::checkNumericGetType(attribute &a1)
     {
         StringBuffer msg("Type mismatch - Integer or real value expected (");
         getFriendlyTypeStr(t1, msg).append(" was given)");
-        reportError(ERR_TYPEMISMATCH_INTREAL, a1, msg.str());
+        reportError(ERR_TYPEMISMATCH_INTREAL, a1, "%s", msg.str());
         t1->Release();
         t1 = makeIntType(DEFAULT_INT_SIZE, true);
     }
@@ -5349,7 +5349,7 @@ IHqlExpression * HqlGram::processSortList(const attribute & errpos, node_operato
             {
                 StringBuffer msg;
                 msg.append(attr).append(" is not valid here");
-                reportError(ERR_ILL_HERE, errpos, msg.str());
+                reportError(ERR_ILL_HERE, errpos, "%s", msg.str());
             }
             else
                 attributes->setown(createComma(LINK(&e), attributes->getClear()));
@@ -6011,7 +6011,7 @@ IHqlExpression * HqlGram::checkParameter(const attribute * errpos, IHqlExpressio
                             getFriendlyTypeStr(formal,tp1).str(),
                             getFriendlyTypeStr(actual,tp2).str());
                 }
-                reportError(ERR_PARAM_TYPEMISMATCH, *errpos, s.str());
+                reportError(ERR_PARAM_TYPEMISMATCH, *errpos, "%s", s.str());
             }
             return NULL;
         }
@@ -6148,9 +6148,7 @@ bool HqlGram::processParameter(FunctionCallInfo & call, _ATOM name, IHqlExpressi
         if (isOmitted(actual))
             return true;
 
-        StringBuffer s;
-        s.appendf("Too many parameters passed to function %s (expected %d)", funcName->str(), call.numFormals);
-        reportError(ERR_PARAM_TOOMANY, errpos, s.str());
+        reportError(ERR_PARAM_TOOMANY, errpos, "Too many parameters passed to function %s (expected %d)", funcName->str(), call.numFormals);
         return false;
     }
 
@@ -6497,9 +6495,7 @@ IHqlExpression * HqlGram::checkOutputRecord(IHqlExpression *record, const attrib
                 {
 
                     _ATOM name = field->queryName();
-                    StringBuffer text;
-                    text.appendf(REC_FLD_ERR_STR, name ? name->str() : "?");
-                    reportError(ERR_REC_FIELDNODEFVALUE, errpos, text.str());
+                    reportError(ERR_REC_FIELDNODEFVALUE, errpos, REC_FLD_ERR_STR, name ? name->str() : "?");
                     allConstant = false;                                        // no point reporting this as well.
 
                     HqlExprArray args;
@@ -6632,7 +6628,7 @@ void HqlGram::checkIndexFieldType(IHqlExpression * expr, bool isPayload, bool in
                 break;
             case type_packedint:
                 if (!isPayload)
-                    reportError(ERR_INDEX_BADTYPE, errpos, "PACKED integers are not supported inside indexes", name->str());
+                    reportError(ERR_INDEX_BADTYPE, errpos, "PACKED integers (%s) are not supported inside indexes", name->str());
                 break;
             case type_set:
                 if (!variableOk)
@@ -7075,7 +7071,7 @@ void HqlGram::checkGrouping(const attribute& errpos, HqlExprArray & parms, IHqlE
                         if (name)
                             msg.append("'").append(name).append("' ");
                         msg.append("in TABLE does not appear to be properly defined by grouping conditions");
-                        reportWarning(ERR_GROUP_BADSELECT,errpos.pos, msg.str());
+                        reportWarning(ERR_GROUP_BADSELECT,errpos.pos, "%s", msg.str());
                     }
                 }
                 else if (field->isDatarow())
@@ -9346,7 +9342,7 @@ void HqlGram::canNotAssignTypeError(ITypeInfo* expected, ITypeInfo* given, const
     StringBuffer msg("Incompatible types: can not assign ");
     getFriendlyTypeStr(given, msg).append(" to ");
     getFriendlyTypeStr(expected, msg);
-    reportError(ERR_TYPE_INCOMPATIBLE, errpos, msg.str());
+    reportError(ERR_TYPE_INCOMPATIBLE, errpos, "%s", msg.str());
 }
 
 void HqlGram::canNotAssignTypeWarn(ITypeInfo* expected, ITypeInfo* given, const attribute& errpos)
@@ -9354,7 +9350,7 @@ void HqlGram::canNotAssignTypeWarn(ITypeInfo* expected, ITypeInfo* given, const
     StringBuffer msg("Incompatible types: should cast ");
     getFriendlyTypeStr(given, msg).append(" to a ");
     getFriendlyTypeStr(expected, msg);
-    reportWarning(ERR_TYPE_INCOMPATIBLE, errpos.pos, msg.str());
+    reportWarning(ERR_TYPE_INCOMPATIBLE, errpos.pos, "%s", msg.str());
 }
 
 _ATOM HqlGram::getNameFromExpr(attribute& attr)
@@ -10355,7 +10351,7 @@ void HqlGram::checkWorkflowMultiples(IHqlExpression * previousWorkflow, IHqlExpr
                 {
                     StringBuffer buff;
                     buff.append("Multiple ").append(newName).append(" controls are not allowed on an expression");
-                    reportError(ERR_MULTIPLE_WORKFLOW, errpos, buff.str());
+                    reportError(ERR_MULTIPLE_WORKFLOW, errpos, "%s", buff.str());
                 }
             }
             break;
@@ -10364,7 +10360,7 @@ void HqlGram::checkWorkflowMultiples(IHqlExpression * previousWorkflow, IHqlExpr
             {
                 StringBuffer buff;
                 buff.append("Multiple ").append(getOpString(newOp)).append(" controls are not allowed on an expression");
-                reportError(ERR_MULTIPLE_WORKFLOW, errpos, buff.str());
+                reportError(ERR_MULTIPLE_WORKFLOW, errpos, "%s", buff.str());
             }
         }
     }

+ 7 - 7
ecl/hql/hqllex.l

@@ -597,7 +597,7 @@ __LINE__            {
                             return SKIPPED; 
                         StringBuffer msg("Unknown # command: ");
                         msg.append(CUR_TOKEN_TEXT);
-                        lexer->reportError(returnToken, ERR_TMPLT_UNKNOWNCOMMAND,msg.str());
+                        lexer->reportError(returnToken, ERR_TMPLT_UNKNOWNCOMMAND, "%s", msg.str());
                         return lexer->yyLex(returnToken, lookup, activeState); 
                     }
         
@@ -1606,7 +1606,7 @@ FUNCTIONMACRO|MACRO {
                         {
                             lexer->yyColumn = oldColumn + ep + start;
                             returnToken.setPosition(lexer->yyLineNo, lexer->yyColumn, lexer->yyPosition, lexer->querySourcePath());
-                            lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN,msg.str());
+                            lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN, "%s", msg.str());
                             returnToken.setPosition(lexer->yyLineNo, oldColumn, lexer->yyPosition, lexer->querySourcePath());
                         }
                         Owned<IValue> unicodeValue = createUnicodeValue(CUR_TOKEN_TEXT + start, CUR_TOKEN_LENGTH - (start+1), "", true, true);
@@ -1652,7 +1652,7 @@ FUNCTIONMACRO|MACRO {
                                     returnToken.setPosition(lexer->yyLineNo, lexer->yyColumn, lexer->yyPosition, lexer->querySourcePath());
                                     StringBuffer msg("Can not terminate a string with escape char '\\': ");
                                     msg.append(CUR_TOKEN_TEXT);
-                                    lexer->reportError(returnToken, RRR_ESCAPE_ENDWITHSLASH, msg.str());
+                                    lexer->reportError(returnToken, RRR_ESCAPE_ENDWITHSLASH, "%s", msg.str());
                                     if (lexer->isAborting())
                                         return EOF;
                                     returnToken.setPosition(lexer->yyLineNo, oldColumn, lexer->yyPosition, lexer->querySourcePath());
@@ -1714,7 +1714,7 @@ FUNCTIONMACRO|MACRO {
                                         returnToken.setPosition(lexer->yyLineNo, lexer->yyColumn, lexer->yyPosition, lexer->querySourcePath());
                                         StringBuffer msg;
                                         msg.append("3-digit numeric escape sequence contained non-octal digit: ").append(next);
-                                        lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN,msg.str());
+                                        lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN, "%s", msg.str());
                                         if (lexer->isAborting())
                                             return EOF;
                                         returnToken.setPosition(lexer->yyLineNo, oldColumn, lexer->yyPosition, lexer->querySourcePath());
@@ -1736,7 +1736,7 @@ FUNCTIONMACRO|MACRO {
                                     StringBuffer msg;
                                     msg.append("Unrecognized escape sequence: ");
                                     msg.append("\\").append(finger[1]);
-                                    lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN,msg.str());
+                                    lexer->reportError(returnToken, ERR_ESCAPE_UNKNOWN, "%s", msg.str());
                                     if (lexer->isAborting())
                                         return EOF;
 
@@ -1821,7 +1821,7 @@ FUNCTIONMACRO|MACRO {
                         else
                             msg.append(CUR_TOKEN_TEXT);
                         msg.append("\"");
-                        lexer->reportError(returnToken, ERR_STRING_UNENDED,msg.str());
+                        lexer->reportError(returnToken, ERR_STRING_UNENDED, "%s", msg.str());
                         // recovery 
                         returnToken.setExpr(createConstant(""));
                         return STRING_CONST;                        
@@ -1874,7 +1874,7 @@ FUNCTIONMACRO|MACRO {
                         StringBuffer msg;
                         msg.append("hex data can only contains 0-9a-fA-F: ");
                         msg.append(CUR_TOKEN_TEXT);
-                        lexer->reportError(returnToken, ERR_HEXDATA_ILL,msg.str());
+                        lexer->reportError(returnToken, ERR_HEXDATA_ILL, "%s", msg.str());
 
                         // recovering
                         char data[2], str[3] = "00";

+ 18 - 18
ecl/hql/hqlparse.cpp

@@ -238,7 +238,7 @@ bool HqlLex::assertNext(YYSTYPE & returnToken, int expected, unsigned code, cons
 {
     if (yyLex(returnToken, false,0) != expected)
     {
-        reportError(returnToken, code, msg); 
+        reportError(returnToken, code, "%s", msg);
         returnToken.release();
         return false;
     }
@@ -379,7 +379,7 @@ void HqlLex::setMacroParam(const YYSTYPE & errpos, IHqlExpression* funcdef, Stri
             {
                 StringBuffer msg("Omitted parameter ");
                 msg.append(parmno).append(" has no default value");
-                reportError(errpos, ERR_PARAM_NODEFVALUE, msg.str());
+                reportError(errpos, ERR_PARAM_NODEFVALUE, "%s", msg.str());
             }
             else
             {
@@ -387,7 +387,7 @@ void HqlLex::setMacroParam(const YYSTYPE & errpos, IHqlExpression* funcdef, Stri
                 {
                     StringBuffer msg("Default value for parameter ");
                     msg.append(parmno).append(" should be a constant");
-                    reportError(errpos, ERR_PARAM_NODEFVALUE, msg.str());
+                    reportError(errpos, ERR_PARAM_NODEFVALUE, "%s", msg.str());
                 }
             }
         }
@@ -504,7 +504,7 @@ void HqlLex::pushMacro(IHqlExpression *expr)
         if (expr->queryName())
             msg.append(' ').append(expr->queryName());
         msg.appendf(": expected %d, given %d", formalParmCt, parmno);
-        reportError(nextToken, ERR_PARAM_TOOMANY, msg.str());
+        reportError(nextToken, ERR_PARAM_TOOMANY, "%s", msg.str());
     }
     else if (parmno < formalParmCt)
     {
@@ -523,7 +523,7 @@ void HqlLex::pushMacro(IHqlExpression *expr)
                         if (expr->queryName())
                             msg.append(" to macro ").append(expr->queryName());
                         msg.append(" should be a constant value");
-                        reportError(nextToken, ERR_PARAM_NODEFVALUE,msg.str());
+                        reportError(nextToken, ERR_PARAM_NODEFVALUE, "%s", msg.str());
                     }
                     macroParms->setProp(formal->queryName()->str(), curParam.str());
                     //PrintLog("Set macro parm: %s", curParam.str());
@@ -536,7 +536,7 @@ void HqlLex::pushMacro(IHqlExpression *expr)
                     if (expr->queryName())
                         msg.append(" to macro ").append(expr->queryName());
                     msg.append(" has no default value");
-                    reportError(nextToken, ERR_PARAM_NODEFVALUE,msg.str());
+                    reportError(nextToken, ERR_PARAM_NODEFVALUE, "%s", msg.str());
                 }
             }
         }
@@ -548,7 +548,7 @@ void HqlLex::pushMacro(IHqlExpression *expr)
     {
         StringBuffer msg;
         msg.append("recursive macro call: ").append(getMacroName());
-        reportError(nextToken, ERR_MACRO_RECURSIVE, msg.str());
+        reportError(nextToken, ERR_MACRO_RECURSIVE, "%s", msg.str());
         
         // error recovery
         if (expr->isAction()) 
@@ -662,7 +662,7 @@ bool HqlLex::getParameter(StringBuffer &curParam, const char* for_what, int* sta
             {
                 StringBuffer msg("EOF encountered while gathering parameters for ");
                 msg.append(for_what);
-                reportError(nextToken, ERR_TMPLT_EOFINPARAM, msg.str());
+                reportError(nextToken, ERR_TMPLT_EOFINPARAM, "%s", msg.str());
             }
             return false;
         default:
@@ -704,7 +704,7 @@ void HqlLex::doIf(YYSTYPE & returnToken)
             {
                 StringBuffer msg;
                 msg.appendf("Unexpected EOF in %s: #END expected",forwhat.str());
-                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, msg.str());
+                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, "%s", msg.str());
                 clearNestedHash();      // prevent unnecessary more error messages
                 break;
             }
@@ -738,7 +738,7 @@ int HqlLex::doElse(YYSTYPE & returnToken, bool lookup, const short * activeState
             if (tok == EOF)
             {
                 forwhat.insert(0,"Unexpected EOF in ").append(": #END expected");
-                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED,forwhat.str());
+                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, "%s", forwhat.str());
                 clearNestedHash();      // prevent unnecessary more error messages
                 return tok;
             }
@@ -776,7 +776,7 @@ void HqlLex::doDeclare(YYSTYPE & returnToken)
         {
             StringBuffer msg;
             msg.append("Unexpected EOF in ").append(forwhat.str()).append(": ')' expected");
-            reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, msg.str());
+            reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, "%s", msg.str());
             clearNestedHash();      // prevent unnecessary more error messages
             return;
         }
@@ -800,7 +800,7 @@ void HqlLex::doDeclare(YYSTYPE & returnToken)
         {
             StringBuffer msg;
             msg.append("Unexpected EOF in ").append(forwhat.str()).append(": ) expected");
-            reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, msg.str());
+            reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, "%s", msg.str());
             clearNestedHash();      // prevent unnecessary more error messages
         }
         else
@@ -1601,7 +1601,7 @@ bool HqlLex::getDefinedParameter(StringBuffer &curParam, YYSTYPE & returnToken,
             {
                 StringBuffer msg("EOF encountered while gathering parameters for ");
                 msg.append(for_what);
-                reportError(returnToken, ERR_TMPLT_EOFINPARAM, msg.str());
+                reportError(returnToken, ERR_TMPLT_EOFINPARAM, "%s", msg.str());
             }
             return false;
         case UNKNOWN_ID:
@@ -1736,7 +1736,7 @@ IValue *HqlLex::parseConstExpression(const YYSTYPE & errpos, StringBuffer &curPa
         catch (IException* except)
         {
             StringBuffer s;
-            reportError(errpos, except->errorCode(), except->errorMessage(s).str());
+            reportError(errpos, except->errorCode(), "%s", except->errorMessage(s).str());
             except->Release();
         }           
     }
@@ -1993,7 +1993,7 @@ void HqlLex::setXmlSymbol(const YYSTYPE & errpos, const char *name, const char *
     {
         StringBuffer msg("Symbol has not been declared: ");
         msg.append(name);
-        reportError(errpos, ERR_TMPLT_SYMBOLNOTDECLARED,msg.str());
+        reportError(errpos, ERR_TMPLT_SYMBOLNOTDECLARED, "%s", msg.str());
     }
 }
 
@@ -2004,7 +2004,7 @@ void HqlLex::declareXmlSymbol(const YYSTYPE & errpos, const char *name)
     {
         StringBuffer msg("Symbol has already been declared: ");
         msg.append(name);
-        reportError(errpos, ERR_TMPLT_SYMBOLREDECLARE,msg.str());
+        reportError(errpos, ERR_TMPLT_SYMBOLREDECLARE, "%s", msg.str());
     }
 }
 
@@ -2048,7 +2048,7 @@ void HqlLex::loadXML(const YYSTYPE & errpos, const char *name, const char * chil
     {
         StringBuffer msg;
         msg.appendf("Load XML(\'%s\') failed",name);
-        reportError(errpos, ERR_TMPLT_LOADXMLFAILED,msg.str());
+        reportError(errpos, ERR_TMPLT_LOADXMLFAILED, "%s", msg.str());
 
         // recovery: create a default XML scope
         xmlScope = ::loadXML("<xml></xml>");
@@ -2129,7 +2129,7 @@ int HqlLex::yyLex(YYSTYPE & returnToken, bool lookup, const short * activeState)
             {
                 StringBuffer msg("Unexpected EOF: ");
                 msg.append(hashendDepths.ordinality()).append(" more #END needed");
-                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED,msg.str());
+                reportError(returnToken, ERR_TMPLT_HASHENDEXPECTED, "%s", msg.str());
                 hashendDepths.kill(); // prevent unnecessary more error messages
             }
         }

+ 2 - 2
ecl/hql/hqlutil.cpp

@@ -4818,8 +4818,8 @@ protected:
     void createTempTableAssign(HqlExprArray & assigns, IHqlExpression * self, IHqlExpression * curRow, IHqlExpression * expr, unsigned & col, IHqlExpression * selector, HqlMapTransformer & mapper, bool included);
     IHqlExpression * createTempTableTransform(IHqlExpression * self, IHqlExpression * curRow, IHqlExpression * expr, unsigned & col, IHqlExpression * selector, HqlMapTransformer & mapper, bool included);
 
-    void reportWarning(IHqlExpression * location, int code,const char *format, ...);
-    void reportError(IHqlExpression * location, int code,const char *format, ...);
+    void reportWarning(IHqlExpression * location, int code,const char *format, ...) __attribute__((format(printf, 4, 5)));
+    void reportError(IHqlExpression * location, int code,const char *format, ...) __attribute__((format(printf, 4, 5)));
 
 protected:
     IErrorReceiver * errors;

+ 1 - 1
ecl/hql/hqlvalid.hpp

@@ -22,7 +22,7 @@
 
 //Error reporting helpers.
 void HQL_API reportErrorVa(IErrorReceiver * errors, int errNo, const ECLlocation & loc, const char* format, va_list args);
-void HQL_API reportError(IErrorReceiver * errors, int errNo, const ECLlocation & loc, const char * format, ...);
+void HQL_API reportError(IErrorReceiver * errors, int errNo, const ECLlocation & loc, const char * format, ...) __attribute__((format(printf, 4, 5)));
 void HQL_API expandReportError(IErrorReceiver * errors, IECLError* error);
 
 class HQL_API ThrowingErrorReceiver : public CInterface, implements IErrorReceiver

+ 2 - 2
ecl/hql/hqlxmldb.hpp

@@ -58,8 +58,8 @@ interface ITemplateContext : public IInterface
     virtual StringBuffer& mangle(const char* src, StringBuffer& mangled) = 0;
     virtual StringBuffer& demangle(const char* mangled, StringBuffer& demangled) = 0;
 
-    virtual void reportError(int errNo,const char* format,...) = 0;
-    virtual void reportWarning(int warnNo,const char* format,...) = 0;      
+    virtual void reportError(int errNo,const char* format,...) __attribute__((format(printf, 3, 4))) = 0;
+    virtual void reportWarning(int warnNo,const char* format,...) __attribute__((format(printf, 3, 4))) = 0;      
 
     // Ideally, the user has no need to use this.
     virtual IEclRepository* queryDataServer() = 0;

+ 4 - 4
ecl/hqlcpp/hqlcpp.ipp

@@ -1042,7 +1042,7 @@ public:
 
 // Helper functions
 
-    void ThrowStringException(int code,const char *format, ...);            // override the global function to try and add more context information
+    void ThrowStringException(int code,const char *format, ...) __attribute__((format(printf, 3, 4)));            // override the global function to try and add more context information
     void buildServicePrototypes(IHqlScope * scope);
 
     void buildAddress(BuildCtx & ctx, IHqlExpression * expr, CHqlBoundExpr & tgt);
@@ -1092,9 +1092,9 @@ public:
     bool registerGlobalUsage(IHqlExpression * filename);
     IHqlExpression * queryActiveNamedActivity();
     IHqlExpression * queryActiveActivityLocation() const;
-    void reportWarning(unsigned id, const char * msg, ...);
-    void reportWarning(IHqlExpression * location, unsigned id, const char * msg, ...);
-    void reportError(IHqlExpression * location, int code,const char *format, ...);
+    void reportWarning(unsigned id, const char * msg, ...) __attribute__((format(printf, 3, 4)));
+    void reportWarning(IHqlExpression * location, unsigned id, const char * msg, ...) __attribute__((format(printf, 4, 5)));
+    void reportError(IHqlExpression * location, int code,const char *format, ...) __attribute__((format(printf, 4, 5)));
     void reportErrorDirect(IHqlExpression * location, int code,const char *msg, bool alwaysAbort);
     void addWorkunitException(WUExceptionSeverity severity, unsigned code, const char * msg, IHqlExpression * location);
     void useFunction(IHqlExpression * funcdef);

+ 1 - 1
ecl/hqlcpp/hqlstmt.hpp

@@ -109,7 +109,7 @@ public:
     IHqlStmt *                  addLine(const char * filename = NULL, unsigned lineNum = 0);
     IHqlStmt *                  addLoop(IHqlExpression * cond, IHqlExpression * next, bool atEnd);
     IHqlStmt *                  addQuoted(const char * text);
-    IHqlStmt *                  addQuotedF(const char * text, ...);
+    IHqlStmt *                  addQuotedF(const char * text, ...) __attribute__((format(printf, 2, 3)));
     IHqlStmt *                  addQuotedCompound(const char * text, const char * extra = NULL);
     IHqlStmt *                  addQuotedCompoundOpt(const char * text, const char * extra = NULL);
     IHqlStmt *                  addQuoted(StringBuffer & text)              { return addQuoted(text.str()); }

+ 1 - 1
ecl/hthor/hthor.hpp

@@ -212,7 +212,7 @@ class IHThorException : public IException
 {
 };
 
-extern HTHOR_API IHThorException * makeHThorException(ThorActivityKind kind, unsigned activityId, unsigned subgraphId, int code, char const * format, ...);
+extern HTHOR_API IHThorException * makeHThorException(ThorActivityKind kind, unsigned activityId, unsigned subgraphId, int code, char const * format, ...) __attribute__((format(printf, 5, 6)));
 extern HTHOR_API IHThorException * makeHThorException(ThorActivityKind kind, unsigned activityId, unsigned subgraphId, IException * exc);
 extern HTHOR_API IHThorException * makeHThorException(ThorActivityKind kind, unsigned activityId, unsigned subgraphId, IException * exc, char const * extra);
 

+ 1 - 1
esp/bindings/bind_ng.hpp

@@ -112,7 +112,7 @@ public:
     bool validateFeatureAccess(const char * pszFeatureUrl, unsigned required, bool throwExcpt){return true;}
     void setServAddress(const char * host, short port){}
     void getServAddress(StringBuffer & host, short & port){}
-    void AuditMessage(AuditType type, const char * filterType, const char * title, const char * parms, ...){}
+    void AuditMessage(AuditType type, const char * filterType, const char * title, const char * parms, ...) {}
 
     void setServiceName(const char *name){servname.clear().append(servname);}
     const char * queryServiceName(const char *name){return servname.str();}

+ 1 - 1
esp/esplib/pqueue.hpp

@@ -131,7 +131,7 @@ interface ITask: extends IInterface
 
 interface IErrorListener: extends IInterface
 {
-    virtual void reportError(const char* err,...)=0;
+    virtual void reportError(const char* err,...) __attribute__((format(printf, 2, 3))) =0;
 };
 
 class TaskQueue

+ 2 - 2
esp/platform/espcontext.hpp

@@ -52,8 +52,8 @@ ESPHTTP_API bool getEspLogRequests();
 ESPHTTP_API bool getEspLogResponses();
 ESPHTTP_API unsigned getSlowProcessingTime();
 
-ESPHTTP_API void ESPLOG(IEspContext* ctx, LogLevel level, const char* fmt, ...);
-ESPHTTP_API void ESPLOG(LogLevel level, const char* fmt, ...);
+ESPHTTP_API void ESPLOG(IEspContext* ctx, LogLevel level, const char* fmt, ...) __attribute__((format(printf, 3, 4)));
+ESPHTTP_API void ESPLOG(LogLevel level, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
 ESPHTTP_API void setEspContainer(IEspContainer* container);
 
 ESPHTTP_API IEspContainer* getESPContainer();

+ 1 - 1
esp/platform/espp.hpp

@@ -152,7 +152,7 @@ public:
     const char* getFrameTitle()  { return m_frameTitle.get(); }
     unsigned getSlowProcessingTime() { return m_slowProcessingTime; }
 
-    void log(LogLevel level, const char* fmt, ...)
+    void log(LogLevel level, const char* fmt, ...) __attribute__((format(printf, 3, 4)))
     {
         if (getLogLevel()>=level)
         {

+ 1 - 1
esp/platform/sechandler.hpp

@@ -34,7 +34,7 @@ class SecHandler : public CInterface
     Owned<IAuthMap> m_feature_authmap;
 private:
     bool authorizeTrial(ISecUser& user,const char* pszFeatureUrl, SecAccessFlags & required_access);
-    void AuditMessage(AuditType type, const char *filterType, const char *title, const char *parms, ...);
+    void AuditMessage(AuditType type, const char *filterType, const char *title, const char *parms, ...) __attribute__((format(printf, 5, 6)));
 
 public:
     IMPLEMENT_IINTERFACE;

+ 3 - 2
esp/scm/esp.ecm

@@ -153,7 +153,7 @@ interface IEspContext : extends IInterface
     virtual bool validateFeatureAccess(const char * pszFeatureUrl, unsigned required, bool throwExcpt) = 0;
     virtual void setServAddress(const char * host, short port) = 0;
     virtual void getServAddress(StringBuffer & host, short & port) = 0;
-    virtual void AuditMessage(AuditType type, const char * filterType, const char * title, const char * parms, ...) = 0;
+    virtual void AuditMessage(AuditType type, const char * filterType, const char * title, const char * parms, ...) __attribute__((format(printf, 5, 6))) = 0;
 
     virtual void setServiceName(const char *name)=0;
     virtual const char * queryServiceName(const char *name)=0;
@@ -212,8 +212,9 @@ interface IEspContainer : extends IInterface
     virtual LogLevel getLogLevel() = 0;
     virtual bool getLogRequests() = 0;
     virtual bool getLogResponses() = 0;
-    virtual unsigned getSlowProcessingTime() = 0;
     virtual void log(LogLevel level, const char*,...) = 0;
+    virtual unsigned getSlowProcessingTime() = 0;
+    virtual void log(LogLevel level, const char*,...) __attribute__((format(printf, 3, 4))) = 0;
     virtual void setFrameTitle(const char* title) = 0;
     virtual const char* getFrameTitle() = 0;
     virtual void sendSnmpMessage(const char* msg) = 0;

+ 1 - 1
esp/services/ws_dfu/ws_dfuXRefService.cpp

@@ -27,7 +27,7 @@
 
 static const char* FEATURE_URL = "DfuXrefAccess";
 
-static void appendReplyMessage(StringBuffer &reply, const char *href,const char *format,...)
+static void appendReplyMessage(StringBuffer &reply, const char *href,const char *format,...) __attribute__((format(printf, 3, 4)))
 {
     va_list args;
     va_start(args, format);

+ 2 - 2
esp/services/ws_smc/ws_smcService.cpp

@@ -33,7 +33,7 @@ const char* THORQUEUE_FEATURE = "ThorQueueAccess";
 
 const char* PERMISSIONS_FILENAME = "espsmc_permissions.xml";
 
-void AccessSuccess(IEspContext& context, char const * msg,...)
+void AccessSuccess(IEspContext& context, char const * msg,...) __attribute__((format(printf, 2, 3)))
 {
     StringBuffer buf;
     buf.appendf("User %s: ",context.queryUserId());
@@ -44,7 +44,7 @@ void AccessSuccess(IEspContext& context, char const * msg,...)
     AUDIT(AUDIT_TYPE_ACCESS_SUCCESS,buf.str());
 }
 
-void AccessFailure(IEspContext& context, char const * msg,...)
+void AccessFailure(IEspContext& context, char const * msg,...) __attribute__((format(printf, 2, 3)))
 {
     StringBuffer buf;
     buf.appendf("User %s: ",context.queryUserId());

+ 2 - 2
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -941,7 +941,7 @@ int WUSchedule::run()
     return 0;
 }
 
-void AccessSuccess(IEspContext& context, char const * msg,...)
+void AccessSuccess(IEspContext& context, char const * msg,...) __attribute__((format(printf, 2, 3)))
 {
     StringBuffer buf;
     buf.appendf("User %s: ",context.queryUserId());
@@ -952,7 +952,7 @@ void AccessSuccess(IEspContext& context, char const * msg,...)
     AUDIT(AUDIT_TYPE_ACCESS_SUCCESS,buf.str());
 }
 
-void AccessFailure(IEspContext& context, char const * msg,...)
+void AccessFailure(IEspContext& context, char const * msg,...) __attribute__((format(printf, 2, 3)))
 {
     StringBuffer buf;
     buf.appendf("User %s: ",context.queryUserId());

+ 1 - 1
esp/tools/soapplus/xmldiff.hpp

@@ -38,7 +38,7 @@ private:
     bool cmpPtree(const char* xpath, IPropertyTree* t1, IPropertyTree* t2, const char* xpathFull);
     int countDiff(const char* xpath, IPropertyTree* t1, IPropertyTree* t2, const char* xpathFull);
     int countLeaves(IPropertyTree* t);
-    void printDiff(const char *fmt, ...);
+    void printDiff(const char *fmt, ...) __attribute__((format(printf, 2, 3)));
     bool cmpAttributes(IPTree* t1, IPTree* t2, const char* xpath, bool print);
     void getAttrString(IPropertyTree* t1, StringBuffer& attrBuff);
 };

+ 1 - 1
esp/tools/wizards/esp_service_wizard/Debug.h

@@ -19,7 +19,7 @@
 // Note: file names are still ANSI strings (filenames rarely need UNICODE)
 BOOL AssertFailedLine(LPCSTR lpszFileName, int nLine);
 
-void Trace(LPCTSTR lpszFormat, ...);
+void Trace(LPCTSTR lpszFormat, ...) __attribute__((format(printf, 1, 2)));
 
 // by default, debug break is asm int 3, or a call to DebugBreak, or nothing
 #if defined(_M_IX86)

+ 1 - 1
services/winremote/winremote.cpp

@@ -652,7 +652,7 @@ public:
 
 protected:
 
-    void print(const char* format,...)
+    void print(const char* format,...) __attribute__((format(printf, 2, 3)))
     {
         if(!output)
             return;

+ 1 - 1
system/hrpc/hrpc.ipp

@@ -28,7 +28,7 @@
 IHRPC_Exception *MakeHRPCexception(int code);
 IHRPC_Exception *MakeHRPCexception(int code,IException *e);
 #ifdef _HRPCTRACE
-void HRPCtrace(const char *fmt, ...);
+void HRPCtrace(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
 
 #define THROWHRPCEXCEPTION(code) { HRPCtrace("\nRaising HRPC exception %d at %s line %d\n",code, __FILE__, __LINE__);\
    throw MakeHRPCexception(code); }

+ 1 - 1
system/jhtree/ctfile.hpp

@@ -334,7 +334,7 @@ enum KeyExceptionCodes
     KeyExcpt_IncompatVersion = 1,
 };
 interface IKeyException : extends IException { };
-IKeyException *MakeKeyException(int code, const char *format, ...);
+IKeyException *MakeKeyException(int code, const char *format, ...) __attribute__((format(printf, 2, 3)));
 
 
 #endif

+ 2 - 2
tools/backupnode/backupnode.cpp

@@ -65,7 +65,7 @@ static bool inexactDateMatch = false;
 #define println PROGLOG
 #define printerr ERRLOG
 #else
-static void println(const char *format, ...)
+static void println(const char *format, ...) __attribute__((format(printf, 1, 2)))
 {
     va_list x;
     va_start(x, format);
@@ -75,7 +75,7 @@ static void println(const char *format, ...)
     va_end(x);
 }
 
-static void printerr(const char *format, ...)
+static void printerr(const char *format, ...) __attribute__((format(printf, 1, 2)))
 {
     va_list x;
     va_start(x, format);

+ 3 - 3
tools/backupnode/backupnode2.cpp

@@ -52,7 +52,7 @@ public:
     unsigned numfiles;
     IArrayOf<IFileIOStream> *outStreams;
 
-    void log(const char * format, ...)
+    void log(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         va_list args;
         va_start(args, format);
@@ -62,7 +62,7 @@ public:
         PROGLOG(LOGPFX "%s",line.str());
     }
 
-    void error(const char * format, ...)
+    void error(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         va_list args;
         va_start(args, format);
@@ -72,7 +72,7 @@ public:
         ERRLOG(LOGPFX "%s",line.str());
     }
 
-    void warn(const char * format, ...)
+    void warn(const char * format, ...) __attribute__((format(printf, 2, 3)))
     {
         va_list args;
         va_start(args, format);

+ 1 - 1
tools/dumpkey/dumpkey.cpp

@@ -20,7 +20,7 @@
 #include "jhtree.hpp"
 #include "ctfile.hpp"
 
-void fatal(const char *format, ...)
+void fatal(const char *format, ...) __attribute__((format(printf, 1, 2)))
 {
     va_list      args;
 

+ 1 - 1
tools/esdl/esdl.cpp

@@ -881,7 +881,7 @@ Error3:
         out(s,strlen(s));
     }
 
-    void outf(const char *fmt, ...)
+    void outf(const char *fmt, ...) __attribute__((format(printf, 2, 3)))
     {
         static char buf[0x4000];
         va_list args;

+ 5 - 3
tools/esdl/esdl_utils.hpp

@@ -19,6 +19,8 @@
 #ifndef __ESDL_UTILS_HPP__
 #define __ESDL_UTILS_HPP__
 
+#include "platform.h"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -60,8 +62,8 @@ public:
     StrBuffer &  append(const char * value);
     StrBuffer &  append(unsigned len, const char * value);
 
-    StrBuffer &  appendf(const char *format, ...);
-    StrBuffer &  setf(const char* format, ...);
+    StrBuffer &  appendf(const char *format, ...) __attribute__((format(printf, 2, 3)));
+    StrBuffer &  setf(const char* format, ...) __attribute__((format(printf, 2, 3)));
     StrBuffer &  set(const char* val) { return clear().append(val); }
     StrBuffer &  clear() { curLen = 0; return *this; }
     
@@ -105,7 +107,7 @@ private:
 class VStrBuffer : public StrBuffer
 {
 public:
-    VStrBuffer(const char* format, ...);
+    VStrBuffer(const char* format, ...) __attribute__((format(printf, 2, 3)));
 };
 
 

+ 1 - 2
tools/esdl/esdlcomp.cpp

@@ -292,7 +292,6 @@ void outf(const char *fmt, ...)
     va_list args;
     va_start(args, fmt);
     voutf(fmt,args);
-    
 }
 
 void outf(int indents, const char *fmt, ...)
@@ -701,7 +700,7 @@ static char* getToBeDefinedType(const char* type)
     {
         char msg[128];
         sprintf(msg, "*** unhandled type: %s", type);
-        outf(msg);
+        outs(msg);
         yyerror(msg);
         return NULL;
     }

+ 3 - 3
tools/esdl/esdlcomp.h

@@ -106,9 +106,9 @@ enum  clarion_special_type_enum { cte_normal,cte_longref,cte_constcstr,cte_cstr
 
 void out(const char*, size_t);
 void outs(const char*);
-void outf(const char*,...);
+void outf(const char*,...) __attribute__((format(printf, 1, 2)));
 void outs(int indent, const char*);
-void outf(int indent, const char*,...);
+void outf(int indent, const char*,...) __attribute__((format(printf, 2, 3)));
 
 char *appendstr(char *text,const char *str);
 
@@ -190,7 +190,7 @@ public:
         strcpy(name_,(value)? value : (char *)"");
     }
     
-    void setNameF(const char *format, ...)
+    void setNameF(const char *format, ...) __attribute__((format(printf, 2, 3)))
     {
         va_list args;
         va_start(args, format);

+ 1 - 1
tools/hidl/Hidl.cpp

@@ -881,7 +881,7 @@ Error3:
         out(s,strlen(s));
     }
 
-    void outf(const char *fmt, ...)
+    void outf(const char *fmt, ...) __attribute__((format(printf, 2, 3)))
     {
         static char buf[0x4000];
         va_list args;

+ 3 - 3
tools/hidl/hidl_utils.hpp

@@ -64,8 +64,8 @@ public:
     StrBuffer &  append(const char * value);
     StrBuffer &  append(unsigned len, const char * value);
 
-    StrBuffer &  appendf(const char *format, ...);
-    StrBuffer &  setf(const char* format, ...);
+    StrBuffer &  appendf(const char *format, ...) __attribute__((format(printf, 2, 3)));
+    StrBuffer &  setf(const char* format, ...) __attribute__((format(printf, 2, 3)));
     StrBuffer &  set(const char* val) { return clear().append(val); }
     StrBuffer &  clear() { curLen = 0; return *this; }
     StrBuffer & va_append(const char *format, va_list args);
@@ -106,7 +106,7 @@ private:
 class VStrBuffer : public StrBuffer
 {
 public:
-    VStrBuffer(const char* format, ...);
+    VStrBuffer(const char* format, ...) __attribute__((format(printf, 2, 3)));
 };
 
 StrBuffer& encodeXML(const char *x, StrBuffer &ret);

+ 13 - 16
tools/hidl/hidlcomp.cpp

@@ -315,8 +315,7 @@ void outf(const char *fmt, ...)
 {
     va_list args;
     va_start(args, fmt);
-    voutf(fmt,args);
-    
+    voutf(fmt,args);    
 }
 
 void outf(int indents, const char *fmt, ...)
@@ -802,7 +801,7 @@ static char* getToBeDefinedType(const char* type)
     {
         char msg[128];
         sprintf(msg, "*** unhandled type: %s", type);
-        outf(msg);
+        outs(msg);
         yyerror(msg);
         return NULL;
     }
@@ -1037,8 +1036,8 @@ void ParamInfo::write_esp_init(bool &isFirst, bool msgRemoveNil)
             {
             case MetaTagInfo::mt_string: outf("%s",deftag->getString()); break;
             case MetaTagInfo::mt_int:    outf("\"%d\"", deftag->getInt()); break;
-            case MetaTagInfo::mt_double: outf("%\"g\"", deftag->getDouble()); break;
-            case MetaTagInfo::mt_const_id: outf("%\"s\"", deftag->getName()); break;
+            case MetaTagInfo::mt_double: outf("\"%g\"", deftag->getDouble()); break;
+            case MetaTagInfo::mt_const_id: outf("\"%s\"", deftag->getName()); break;
             case MetaTagInfo::mt_none: assert(false); break;
             }
             outf(")");
@@ -1364,7 +1363,7 @@ void ParamInfo::write_esp_attr_method(const char *msgname, bool isSet, bool parN
             }
             else
             {
-                outf("{ m_%s.copy(ifrom); }\n", name, typname);
+                outf("{ m_%s.copy(ifrom); }\n", name);
             }
         }
         else if (kind==TK_ESPENUM)
@@ -1598,7 +1597,7 @@ void ParamInfo::write_esp_attr_method(const char *msgname, bool isSet, bool parN
                     outs("\t");
                 if (isDecl && isPure)
                     outs("virtual ");
-                outf("const char* ", typname);
+                outs("const char* ");
                 if (!isDecl && msgname)
                     outf("C%s::", msgname);
                 outf("get%sAsString()", methName);
@@ -2092,8 +2091,6 @@ void ProcInfo::out_method(const char *classpfx, int omitvirt)
         }
         else
             rettype->out_type();
-        if (isSCM)
-            outf("");
         if (classpfx)
             outf(" %s::%s",classpfx,name);
         else
@@ -2147,15 +2144,15 @@ void ProcInfo::write_body_method_structs2(const char * modname)
         if (a>0) {
             dummy++;
             if (a>1)
-                outf("\tchar __dummy%d[%d];\n",dummy,a);
+                outf("\tchar __dummy%d[%u];\n",dummy,(unsigned)a);
             else
-                outf("\tchar __dummy%d;\n",dummy,a);
+                outf("\tchar __dummy%d;\n",dummy);
         }
         p->write_body_struct_elem(0);
     }
     if (align>0) {
         dummy++;
-        outf("\tchar _dummy%d[%d];\n",dummy,4-align);
+        outf("\tchar _dummy%d[%u];\n",dummy,(unsigned)(4-align));
         align = 0;
     }
     ForEachParam(this,p,PF_IN,PF_OUT|PF_SIMPLE) {
@@ -2172,7 +2169,7 @@ void ProcInfo::write_body_method_structs2(const char * modname)
         rettype->write_body_struct_elem(0);
         if (align>0) {
             dummy++;
-            outf("\tchar _dummy%d[%d];\n",dummy,4-align);
+            outf("\tchar _dummy%d[%u];\n",dummy,(unsigned)(4-align));
             align = 0;
         }
     }
@@ -2650,7 +2647,7 @@ void ModuleInfo::write_body_class_stub(int cb)
             switchdone = 1;
         }
         outf("\tcase %d: {\n",fn);
-        outf("\t\t\tHRPC_d_%s__%s _params;\n",name,pi->name,name,pi->name);
+        outf("\t\t\tHRPC_d_%s__%s _params;\n",name,pi->name);
         outs("\t\t\t_params.popparams(_b);\n");
         if (pi->async) {
             outs("\t\t\t_returnasync(_br);\n");
@@ -2957,7 +2954,7 @@ void EspMessageInfo::write_esp_ipp()
         outf("\t{ doInit(); }\n");
         outf("\tCX%s(C%s defvalue_) : SoapEnumParamNew<C%s>(defvalue_)\n", name_, name_, name_);
         outf("\t{ doInit(); }\n");
-        outf("\tCX%s(const char* defvalue_) : SoapEnumParamNew<C%s>()\n", name_, name_, name_);
+        outf("\tCX%s(const char* defvalue_) : SoapEnumParamNew<C%s>()\n", name_, name_);
         outf("\t{ doInit(); setDefaultValue(defvalue_); }\n");
 
 
@@ -2968,7 +2965,7 @@ void EspMessageInfo::write_esp_ipp()
         // getMapInfo()
         outs("\tstatic void getMapInfo(IMapInfo& info, BoolHash& added) { getSharedInstance().getMapInfo_(info,added); }\n\n");
         outf("\tstatic const char* stringOf(C%s val) { return getSharedInstance().toString(val); }\n\n",name_);
-        outf("\tstatic C%s enumOf(const char* s) { return getSharedInstance().toEnum(s); }\n\n",name_, name_);
+        outf("\tstatic C%s enumOf(const char* s) { return getSharedInstance().toEnum(s); }\n\n",name_);
 
         outf("static const char *queryXsdElementName() { return \"%s\"; }\n", name_);
 

+ 3 - 3
tools/hidl/hidlcomp.h

@@ -101,9 +101,9 @@ enum  clarion_special_type_enum { cte_normal,cte_longref,cte_constcstr,cte_cstr
 
 void out(const char*, size_t);
 void outs(const char*);
-void outf(const char*,...);
+void outf(const char*,...) __attribute__((format(printf, 1, 2)));
 void outs(int indent, const char*);
-void outf(int indent, const char*,...);
+void outf(int indent, const char*,...) __attribute__((format(printf, 2, 3)));
 
 struct attribute
 {
@@ -233,7 +233,7 @@ public:
         atr_type = t_name;
     }
     
-    void setNameF(const char *format, ...)
+    void setNameF(const char *format, ...) __attribute__((format(printf, 2, 3)))
     {
         release();
         

+ 2 - 0
tools/start-stop-daemon/start-stop-daemon.c

@@ -221,6 +221,8 @@ static bool pid_is_exec(pid_t pid, const struct stat *esb);
 
 static void fatal(const char *format, ...)
     DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1);
+static void warning(const char *format, ...)
+    DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1);
 static void badusage(const char *msg)
     DPKG_ATTR_NORET;
 

+ 1 - 1
tools/vkey/vkey.cpp

@@ -173,7 +173,7 @@ unsigned long mcrc32(const char *buf, unsigned len, unsigned long crc)
     return(crc);
 }
 
-void noteError(offset_t offset, const char *format, ...)
+void noteError(offset_t offset, const char *format, ...) __attribute__((format(printf, 2, 3)))
 {
     va_list arg;
     va_start(arg, format);