From 5646906f5be7d3a0909fc2d2c29b0904324d574c Mon Sep 17 00:00:00 2001 From: Luboš Luňák Date: Fri, 26 Oct 2012 19:24:24 +0200 Subject: do not warn about missing area in SAL_DEBUG Change-Id: I99314136cac7f47a5adf8e0e29093ec9fbf4fd90 --- compilerplugins/clang/sallogareas.cxx | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'compilerplugins') diff --git a/compilerplugins/clang/sallogareas.cxx b/compilerplugins/clang/sallogareas.cxx index 1a4a8b25c3c2..016e004a9669 100644 --- a/compilerplugins/clang/sallogareas.cxx +++ b/compilerplugins/clang/sallogareas.cxx @@ -11,6 +11,7 @@ #include "sallogareas.hxx" #include +#include #include @@ -54,15 +55,15 @@ bool SalLogAreas::VisitCallExpr( CallExpr* call ) string qualifiedName = func->getQualifiedNameAsString(); if( qualifiedName == "sal_detail_log" || qualifiedName == "sal::detail::log" ) { + // The SAL_DETAIL_LOG_STREAM macro expands to two calls to sal::detail::log(), + // so do not warn repeatedly about the same macro (the area->getLocStart() of all the calls + // from the same macro should be the same). + SourceLocation expansionLocation = context.getSourceManager().getExpansionLoc( call->getLocStart()); + if( expansionLocation == lastSalDetailLogStreamMacro ) + return true; + lastSalDetailLogStreamMacro = expansionLocation; if( const StringLiteral* area = dyn_cast< StringLiteral >( call->getArg( 1 )->IgnoreParenImpCasts())) { - // The SAL_DETAIL_LOG_STREAM macro expands to two calls to sal::detail::log(), - // so do not warn repeatedly about the same macro (the area->getLocStart() of all the calls - // from the same macro should be the same). - SourceLocation expansionLocation = context.getSourceManager().getExpansionLoc(area->getLocStart()); - if( expansionLocation == lastSalDetailLogStreamMacro ) - return true; - lastSalDetailLogStreamMacro = expansionLocation; if( area->getKind() == StringLiteral::Ascii ) checkArea( area->getBytes(), area->getExprLoc()); else @@ -72,6 +73,21 @@ bool SalLogAreas::VisitCallExpr( CallExpr* call ) } if( inFunction->getQualifiedNameAsString() == "sal::detail::log" ) return true; // This function only forwards to sal_detail_log, so ok. + if( call->getArg( 1 )->isNullPointerConstant( context, Expr::NPC_ValueDependentIsNotNull ) != Expr::NPCK_NotNull ) + { // If the area argument is a null pointer, that is allowed only for SAL_DEBUG. + const SourceManager& source = context.getSourceManager(); + for( SourceLocation loc = call->getLocStart(); + loc.isMacroID(); + loc = source.getImmediateExpansionRange( loc ).first ) + { + StringRef inMacro = Lexer::getImmediateMacroName( loc, source, context.getLangOpts()); + if( inMacro == "SAL_DEBUG" ) + return true; // ok + } + report( DiagnosticsEngine::Warning, "missing log area [loplugin]", + call->getArg( 1 )->IgnoreParenImpCasts()->getLocStart()); + return true; + } report( DiagnosticsEngine::Warning, "cannot analyse log area argument (plugin needs fixing?) [loplugin]", call->getLocStart()); } -- cgit