From 210aefc7778d4e2f6dc6ef736cd142fdada480a5 Mon Sep 17 00:00:00 2001 From: Andrey Mazo Date: Sun, 23 Mar 2014 19:08:54 +0400 Subject: [PATCH] Bug 1170: Formulate best practices for dealing with unused debug variables. Fixed clang-3.4 unused function warnings in optimized builds like the following: """ ../examples/energy/energy-model-example.cc:39:1: error: unused function 'PrintReceivedPacket' [-Werror,-Wunused-function] PrintReceivedPacket (Address& from) ^ 1 error generated. """ Implemented "if (false)" trick inside NS_LOG* macros for optimized builds. "sizeof()" trick might be a little better but it produces the following warning with clang-3.4: """ ../examples/energy/energy-model-example.cc:39:1: error: function 'PrintReceivedPacket' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration] PrintReceivedPacket (Address& from) ^ 1 error generated. """ Macros from log.h, that depend on NS3_LOG_ENABLE, were moved to log-macros-enabled.h and log-macros-disabled.h to make log.h smaller. --- src/core/model/log-macros-disabled.h | 50 ++++++ src/core/model/log-macros-enabled.h | 224 ++++++++++++++++++++++++ src/core/model/log.h | 212 +--------------------- src/core/wscript | 2 + src/internet/test/tcp-test.cc | 4 +- src/olsr/model/olsr-routing-protocol.cc | 2 - 6 files changed, 280 insertions(+), 214 deletions(-) create mode 100644 src/core/model/log-macros-disabled.h create mode 100644 src/core/model/log-macros-enabled.h diff --git a/src/core/model/log-macros-disabled.h b/src/core/model/log-macros-disabled.h new file mode 100644 index 000000000..679a28590 --- /dev/null +++ b/src/core/model/log-macros-disabled.h @@ -0,0 +1,50 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2014 Andrey Mazo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Andrey Mazo + */ + +#ifndef NS3_LOG_MACROS_DISABLED_H +#define NS3_LOG_MACROS_DISABLED_H + +#ifndef NS3_LOG_ENABLE + +#define NS_LOG_NOOP_INTERNAL(msg) \ + do \ + { \ + if (false) \ + { \ + std::clog << msg; \ + } \ + } \ + while (false) + +#define NS_LOG(level, msg) \ + NS_LOG_NOOP_INTERNAL (msg) + +#define NS_LOG_FUNCTION_NOARGS() + +#define NS_LOG_FUNCTION(parameters) \ + NS_LOG_NOOP_INTERNAL (parameters) + +#define NS_LOG_UNCOND(msg) \ + NS_LOG_NOOP_INTERNAL (msg) + + +#endif /* !NS3_LOG_ENABLE */ + +#endif /* NS3_LOG_MACROS_DISABLED_H */ diff --git a/src/core/model/log-macros-enabled.h b/src/core/model/log-macros-enabled.h new file mode 100644 index 000000000..5683203b1 --- /dev/null +++ b/src/core/model/log-macros-enabled.h @@ -0,0 +1,224 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2006,2007 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ + +#ifndef NS3_LOG_MACROS_ENABLED_H +#define NS3_LOG_MACROS_ENABLED_H + +#ifdef NS3_LOG_ENABLE + + +/** + * \ingroup logging + * Append the simulation time to a log message. + * \internal + * Logging implementation macro; should not be called directly. + */ +#define NS_LOG_APPEND_TIME_PREFIX \ + if (g_log.IsEnabled (ns3::LOG_PREFIX_TIME)) \ + { \ + ns3::LogTimePrinter printer = ns3::LogGetTimePrinter (); \ + if (printer != 0) \ + { \ + (*printer)(std::clog); \ + std::clog << " "; \ + } \ + } + +/** + * \ingroup logging + * Append the simulation node id to a log message. + * \internal + * Logging implementation macro; should not be called directly. + */ +#define NS_LOG_APPEND_NODE_PREFIX \ + if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE)) \ + { \ + ns3::LogNodePrinter printer = ns3::LogGetNodePrinter (); \ + if (printer != 0) \ + { \ + (*printer)(std::clog); \ + std::clog << " "; \ + } \ + } + +/** + * \ingroup logging + * Append the function name to a log message. + * \internal + * Logging implementation macro; should not be called directly. + */ +#define NS_LOG_APPEND_FUNC_PREFIX \ + if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) \ + { \ + std::clog << g_log.Name () << ":" << \ + __FUNCTION__ << "(): "; \ + } \ + +/** + * \ingroup logging + * Append the log severity level to a log message. + * \internal + * Logging implementation macro; should not be called directly. + */ +#define NS_LOG_APPEND_LEVEL_PREFIX(level) \ + if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL)) \ + { \ + std::clog << "[" << g_log.GetLevelLabel (level) << "] "; \ + } \ + + +#ifndef NS_LOG_APPEND_CONTEXT +/** + * \ingroup logging + * Append the node id to a log message. + * + * This is implemented locally in `.cc` files because + * the the relevant variable is only known there. + * + * Preferred format is something like (assuming the node id is + * accessible from `var`: + * \code + * if (var) + * { + * std::clog << "[node " << var->GetObject ()->GetId () << "] "; + * } + * \endcode + * + * \internal + * Logging implementation macro; should not be called directly. + * + */ +#define NS_LOG_APPEND_CONTEXT +#endif /* NS_LOG_APPEND_CONTEXT */ + + +/** + * \ingroup logging + * + * This macro allows you to log an arbitrary message at a specific + * log level. + * + * The log message is expected to be a C++ ostream + * message such as "my string" << aNumber << "my oth stream". + * + * Typical usage looks like: + * \code + * NS_LOG (LOG_DEBUG, "a number="< #include +#include "log-macros-enabled.h" +#include "log-macros-disabled.h" + namespace ns3 { /** @@ -180,127 +183,6 @@ void LogComponentDisableAll (enum LogLevel level); #define NS_LOG_COMPONENT_DEFINE_MASK(name, mask) \ static ns3::LogComponent g_log = ns3::LogComponent (name, mask) -/** - * \ingroup logging - * Append the simulation time to a log message. - * \internal - * Logging implementation macro; should not be called directly. - */ -#define NS_LOG_APPEND_TIME_PREFIX \ - if (g_log.IsEnabled (ns3::LOG_PREFIX_TIME)) \ - { \ - ns3::LogTimePrinter printer = ns3::LogGetTimePrinter (); \ - if (printer != 0) \ - { \ - (*printer)(std::clog); \ - std::clog << " "; \ - } \ - } - -/** - * \ingroup logging - * Append the simulation node id to a log message. - * \internal - * Logging implementation macro; should not be called directly. - */ -#define NS_LOG_APPEND_NODE_PREFIX \ - if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE)) \ - { \ - ns3::LogNodePrinter printer = ns3::LogGetNodePrinter (); \ - if (printer != 0) \ - { \ - (*printer)(std::clog); \ - std::clog << " "; \ - } \ - } - -/** - * \ingroup logging - * Append the function name to a log message. - * \internal - * Logging implementation macro; should not be called directly. - */ -#define NS_LOG_APPEND_FUNC_PREFIX \ - if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC)) \ - { \ - std::clog << g_log.Name () << ":" << \ - __FUNCTION__ << "(): "; \ - } \ - -/** - * \ingroup logging - * Append the log severity level to a log message. - * \internal - * Logging implementation macro; should not be called directly. - */ -#define NS_LOG_APPEND_LEVEL_PREFIX(level) \ - if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL)) \ - { \ - std::clog << "[" << g_log.GetLevelLabel (level) << "] "; \ - } \ - - -#ifndef NS_LOG_APPEND_CONTEXT -/** - * \ingroup logging - * Append the node id to a log message. - * - * This is implemented locally in `.cc` files because - * the the relevant variable is only known there. - * - * Preferred format is something like (assuming the node id is - * accessible from `var`: - * \code - * if (var) - * { - * std::clog << "[node " << var->GetObject ()->GetId () << "] "; - * } - * \endcode - * - * \internal - * Logging implementation macro; should not be called directly. - * - */ -#define NS_LOG_APPEND_CONTEXT -#endif /* NS_LOG_APPEND_CONTEXT */ - - -#ifdef NS3_LOG_ENABLE - -/** - * \ingroup logging - * - * This macro allows you to log an arbitrary message at a specific - * log level. - * - * The log message is expected to be a C++ ostream - * message such as "my string" << aNumber << "my oth stream". - * - * Typical usage looks like: - * \code - * NS_LOG (LOG_DEBUG, "a number="< p) +static inline std::string GetString (Ptr p) { std::ostringstream oss; p->CopyData (&oss, p->GetSize ()); return oss.str (); } -#endif /* NS3_LOG_ENABLE */ TcpTestCase::TcpTestCase (uint32_t totalStreamSize, uint32_t sourceWriteSize, diff --git a/src/olsr/model/olsr-routing-protocol.cc b/src/olsr/model/olsr-routing-protocol.cc index 532553b7b..99835d5fd 100644 --- a/src/olsr/model/olsr-routing-protocol.cc +++ b/src/olsr/model/olsr-routing-protocol.cc @@ -2456,9 +2456,7 @@ RoutingProtocol::LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness) if (nb_tuple != NULL) { -#ifdef NS3_LOG_ENABLE int statusBefore = nb_tuple->status; -#endif // NS3_LOG_ENABLE bool hasSymmetricLink = false;