Bug 1283395 - add markup functions for static analysis builds. r?froydnj draft
authorAndi-Bogdan Postelnicu <bpostelnicu@mozilla.com>
Fri, 08 Jul 2016 17:11:06 +0300
changeset 386110 8bbf0efcc5244b1bd6e8f40c17a28253ffe9d972
parent 386109 ecac906eabdbd2f86d076a7ed54d58b62feecbb9
child 525037 2528dc1f2920d4be40b39c664ac6ab24ccccca95
push id22624
push userbmo:bpostelnicu@mozilla.com
push dateMon, 11 Jul 2016 08:06:40 +0000
reviewersfroydnj
bugs1283395
milestone50.0a1
Bug 1283395 - add markup functions for static analysis builds. r?froydnj MozReview-Commit-ID: Fa6auyBM0eJ
mfbt/Assertions.h
mfbt/SAFunctions.h
mfbt/moz.build
--- a/mfbt/Assertions.h
+++ b/mfbt/Assertions.h
@@ -12,16 +12,17 @@
 #if defined(MOZILLA_INTERNAL_API) && defined(__cplusplus)
 #define MOZ_DUMP_ASSERTION_STACK
 #endif
 
 #include "mozilla/Attributes.h"
 #include "mozilla/Compiler.h"
 #include "mozilla/Likely.h"
 #include "mozilla/MacroArgs.h"
+#include "mozilla/SAFunctions.h"
 #ifdef MOZ_DUMP_ASSERTION_STACK
 #include "nsTraceRefcnt.h"
 #endif
 
 #if defined(MOZ_CRASHREPORTER) && defined(MOZILLA_INTERNAL_API) && \
     !defined(MOZILLA_EXTERNAL_LINKAGE) && defined(__cplusplus)
 namespace CrashReporter {
 // This declaration is present here as well as in nsExceptionHandler.h
@@ -363,27 +364,27 @@ struct AssertionConditionType
 #else
 #  define MOZ_VALIDATE_ASSERT_CONDITION_TYPE(x)
 #endif
 
 /* First the single-argument form. */
 #define MOZ_ASSERT_HELPER1(expr) \
   do { \
     MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \
-    if (MOZ_UNLIKELY(!(expr))) { \
+    if (MOZ_UNLIKELY(!MOZ_CHECK_ASSERT_ASSIGNMENT(expr))) { \
       MOZ_ReportAssertionFailure(#expr, __FILE__, __LINE__); \
       MOZ_CRASH_ANNOTATE("MOZ_RELEASE_ASSERT(" #expr ")"); \
       MOZ_REALLY_CRASH(); \
     } \
   } while (0)
 /* Now the two-argument form. */
 #define MOZ_ASSERT_HELPER2(expr, explain) \
   do { \
     MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \
-    if (MOZ_UNLIKELY(!(expr))) { \
+    if (MOZ_UNLIKELY(!MOZ_CHECK_ASSERT_ASSIGNMENT(expr))) { \
       MOZ_ReportAssertionFailure(#expr " (" explain ")", __FILE__, __LINE__); \
       MOZ_CRASH_ANNOTATE("MOZ_RELEASE_ASSERT(" #expr ") (" explain ")"); \
       MOZ_REALLY_CRASH(); \
     } \
   } while (0)
 
 #define MOZ_RELEASE_ASSERT_GLUE(a, b) a b
 #define MOZ_RELEASE_ASSERT(...) \
new file mode 100644
--- /dev/null
+++ b/mfbt/SAFunctions.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_SAFunctions_h
+#define mozilla_SAFunctions_h
+
+#include <stdbool.h>
+ 
+/* Functions that are used as markers in Gecko code for static analysis. Their
+ * purpose is to have different AST nodes generated during compile time and to
+ * match them based on different checkers implemented in build/clang-plugin
+ */
+
+#ifdef MOZ_CLANG_PLUGIN
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * MOZ_AssertAssignmentTest - used in MOZ_ASSERT in order to test the possible
+ * presence of assignment instead of logical comparisons.
+ *
+ * Example:
+ * MOZ_ASSERT(retVal = true);
+ */
+static MOZ_ALWAYS_INLINE void MOZ_AssertAssignmentTest(bool exprResult) {
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#define MOZ_CHECK_ASSERT_ASSIGNMENT(expr) !MOZ_AssertAssignmentTest(!(expr))
+
+#else
+
+#define MOZ_CHECK_ASSERT_ASSIGNMENT(expr) (expr)
+
+#endif /* MOZ_CLANG_PLUGIN */
+#endif /* mozilla_SAFunctions_h */
--- a/mfbt/moz.build
+++ b/mfbt/moz.build
@@ -71,16 +71,17 @@ EXPORTS.mozilla = [
     'RangedArray.h',
     'RangedPtr.h',
     'ReentrancyGuard.h',
     'RefCounted.h',
     'RefCountType.h',
     'RefPtr.h',
     'ReverseIterator.h',
     'RollingMean.h',
+    'SAFunctions.h',
     'Saturate.h',
     'Scoped.h',
     'ScopeExit.h',
     'SegmentedVector.h',
     'SHA1.h',
     'SizePrintfMacros.h',
     'Snprintf.h',
     'SplayTree.h',