Fix the linker so that it will not silently generate ELF binaries with invalid progra...
[deliverable/binutils-gdb.git] / gdb / complaints.c
index fa63418f098ce20f31ddb107f0f80aac022325b2..b35c81de342618c2561d6872b804f29a165a4f2b 100644 (file)
@@ -1,7 +1,6 @@
 /* Support for complaint handling during symbol reading in GDB.
 
-   Copyright (C) 1990, 1991, 1992, 1993, 1995, 1998, 1999, 2000, 2002, 2004,
-   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1990-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "defs.h"
 #include "complaints.h"
-#include "gdb_assert.h"
 #include "command.h"
 #include "gdbcmd.h"
 
 extern void _initialize_complaints (void);
 
-/* Should each complaint message be self explanatory, or should we assume that
-   a series of complaints is being produced?  */
+/* Should each complaint message be self explanatory, or should we
+   assume that a series of complaints is being produced?  */
 
-/* case 1: First message of a series that must
-   start off with explanation.  case 2: Subsequent message of a series
-   that needs no explanation (the user already knows we have a problem
-   so we can just state our piece).  */
 enum complaint_series {
   /* Isolated self explanatory message.  */
   ISOLATED_MESSAGE,
+
   /* First message of a series, includes an explanation.  */
   FIRST_MESSAGE,
+
   /* First message of a series, but does not need to include any sort
      of explanation.  */
   SHORT_FIRST_MESSAGE,
+
   /* Subsequent message of a series that needs no explanation (the
      user already knows we have a problem so we can just state our
      piece).  */
@@ -71,13 +68,7 @@ struct complaints
 {
   struct complain *root;
 
-  /* Should each complaint be self explanatory, or should we assume
-     that a series of complaints is being produced?  case 0: Isolated
-     self explanatory message.  case 1: First message of a series that
-     must start off with explanation.  case 2: Subsequent message of a
-     series that needs no explanation (the user already knows we have
-     a problem so we can just state our piece).  */
-  int series;
+  enum complaint_series series;
 
   /* The explanatory messages that should accompany the complaint.
      NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely
@@ -101,7 +92,7 @@ static struct explanation symfile_explanations[] = {
 
 static struct complaints symfile_complaint_book = {
   &complaint_sentinel,
-  0,
+  ISOLATED_MESSAGE,
   symfile_explanations
 };
 struct complaints *symfile_complaints = &symfile_complaint_book;
@@ -113,7 +104,7 @@ get_complaints (struct complaints **c)
 {
   if ((*c) != NULL)
     return (*c);
-  (*c) = XMALLOC (struct complaints);
+  (*c) = XNEW (struct complaints);
   (*c)->root = &complaint_sentinel;
   (*c)->series = ISOLATED_MESSAGE;
   (*c)->explanation = NULL;
@@ -141,7 +132,7 @@ find_complaint (struct complaints *complaints, const char *file,
     }
 
   /* Oops not seen before, fill in a new complaint.  */
-  complaint = XMALLOC (struct complain);
+  complaint = XNEW (struct complain);
   complaint->fmt = fmt;
   complaint->file = file;
   complaint->line = line;
@@ -165,12 +156,15 @@ static int stop_whining = 0;
    later handling.  */
 
 static void ATTRIBUTE_PRINTF (4, 0)
-vcomplaint (struct complaints **c, const char *file, int line, const char *fmt,
+vcomplaint (struct complaints **c, const char *file, 
+           int line, const char *fmt,
            va_list args)
 {
   struct complaints *complaints = get_complaints (c);
-  struct complain *complaint = find_complaint (complaints, file, line, fmt);
+  struct complain *complaint = find_complaint (complaints, file, 
+                                              line, fmt);
   enum complaint_series series;
+
   gdb_assert (complaints != NULL);
 
   complaint->counter++;
@@ -182,20 +176,27 @@ vcomplaint (struct complaints **c, const char *file, int line, const char *fmt,
   else
     series = complaints->series;
 
+  /* Pass 'fmt' instead of 'complaint->fmt' to printf-like callees
+     from here on, to avoid "format string is not a string literal"
+     warnings.  'fmt' is this function's printf-format parameter, so
+     the compiler can assume the passed in argument is a literal
+     string somewhere up the call chain.  */
+  gdb_assert (complaint->fmt == fmt);
+
   if (complaint->file != NULL)
-    internal_vwarning (complaint->file, complaint->line, complaint->fmt, args);
+    internal_vwarning (complaint->file, complaint->line, fmt, args);
   else if (deprecated_warning_hook)
-    (*deprecated_warning_hook) (complaint->fmt, args);
+    (*deprecated_warning_hook) (fmt, args);
   else
     {
       if (complaints->explanation == NULL)
        /* A [v]warning() call always appends a newline.  */
-       vwarning (complaint->fmt, args);
+       vwarning (fmt, args);
       else
        {
          char *msg;
          struct cleanup *cleanups;
-         msg = xstrvprintf (complaint->fmt, args);
+         msg = xstrvprintf (fmt, args);
          cleanups = make_cleanup (xfree, msg);
          wrap_here ("");
          if (series != SUBSEQUENT_MESSAGE)
@@ -243,6 +244,7 @@ void
 complaint (struct complaints **complaints, const char *fmt, ...)
 {
   va_list args;
+
   va_start (args, fmt);
   vcomplaint (complaints, NULL/*file*/, 0/*line*/, fmt, args);
   va_end (args);
@@ -292,7 +294,8 @@ clear_complaints (struct complaints **c, int less_verbose, int noisy)
     case SUBSEQUENT_MESSAGE:
       /* It would be really nice to use begin_line() here.
          Unfortunately that function doesn't track GDB_STDERR and
-         consequently will sometimes supress a line when it shouldn't.  */
+         consequently will sometimes supress a line when it
+         shouldn't.  */
       fputs_unfiltered ("\n", gdb_stderr);
       break;
     default:
@@ -319,7 +322,8 @@ complaints_show_value (struct ui_file *file, int from_tty,
 void
 _initialize_complaints (void)
 {
-  add_setshow_zinteger_cmd ("complaints", class_support, &stop_whining, _("\
+  add_setshow_zinteger_cmd ("complaints", class_support, 
+                           &stop_whining, _("\
 Set max number of complaints about incorrect symbols."), _("\
 Show max number of complaints about incorrect symbols."), NULL,
                            NULL, complaints_show_value,
This page took 0.026311 seconds and 4 git commands to generate.