diff --git a/src/app/main/main.c b/src/app/main/main.c
index 36f85c6a40f54cb762ea6312da0e999d33438d4c..b533406eaad7a657c11f7aad2773d8a13cae04e8 100644
--- a/src/app/main/main.c
+++ b/src/app/main/main.c
@@ -1240,7 +1240,7 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
 
   int done = 0;
   result = nt_service_parse_options(argc, argv, &done);
-  if (done)
+  if (POSSIBLE(done))
     goto done;
 
   pubsub_install();
diff --git a/src/lib/cc/compat_compiler.h b/src/lib/cc/compat_compiler.h
index 47782fda08f6833b51482e9477b9b3865e880cdf..907622f942d29a8a38cea5e8333073d0a12afa76 100644
--- a/src/lib/cc/compat_compiler.h
+++ b/src/lib/cc/compat_compiler.h
@@ -227,4 +227,17 @@
 #define EAT_SEMICOLON                                   \
   struct dummy_semicolon_eater__
 
+/**
+ * Tell our static analysis tool to believe that (clang's scan-build or
+ * coverity scan) that an expression might be true.  We use this to suppress
+ * dead-code warnings.
+ **/
+#if defined(__COVERITY__) || defined(__clang_analyzer__)
+/* By calling getenv, we force the analyzer not to conclude that 'expr' is
+ * false. */
+#define POSSIBLE(expr) ((expr) || getenv("STATIC_ANALYZER_DEADCODE_DUMMY_"))
+#else
+#define POSSIBLE(expr) (expr)
+#endif
+
 #endif /* !defined(TOR_COMPAT_COMPILER_H) */