Changes between Version 26 and Version 27 of Guidelines/WarningsGuidelines


Ignore:
Timestamp:
Dec 6, 2012, 10:39:58 AM (10 years ago)
Author:
Paul A. Bristow
Comment:

Some more on Clang, but still more needed

Legend:

Unmodified
Added
Removed
Modified
  • Guidelines/WarningsGuidelines

    v26 v27  
    774774So starting from 4.2 but before 4.6, just put near the top of the file something like:
    775775
    776 #pragma GCC diagnostic ignored "-Wdeprecated-declarations
     776#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
    777777
    778778to turn off warnings from that point forward in the file of the use of deprecated declarations.  Problematically, you have no way of knowing what the user had this option set to.  They might have already had the warnings turned on, they might have had them set to ignore, or they might have had them set to cause an error.  At the end of the file, if you do nothing else, the diagnostic for deprecated declarations stays ignored for anything that includes your file.  You can set them to ignored, error, or warning at the end of the file before exiting, but you don't know which to use.  This is sure to cause angst.
    779779====== version 4.6 Now you can restore the user's flags
    780780For version 4.6 or later, you can save the state of the user's diagnostic flags.  You can insert this around the line that causes the spurious warning:
    781 
     781{{{
    782782#pragma GCC diagnostic push[[BR]]
    783783#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
     
    786786
    787787#pragma GCC diagnostic pop
     788}}}
    788789
    789790Of course this could cover everything from a line up to the whole file, and in between the push and the pop you could make multiple changes to each of multiple options.
     
    826827}}}
    827828
    828 These macro names won't collide with GCC macros since their's start with one or two underscores.
     829These macro names won't collide with GCC macros since theirs start with one or two underscores.
    829830
    830831(A list of GCC pre-defined macros is at [http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros]).
     
    848849The workaround for this is to add
    849850
    850  cxxflags=-Wno-attributes
     851{{{cxxflags=-Wno-attributes}}}
    851852
    852853to the <compileflags> and <linkflags> in user-config file
     
    862863[http://clang.llvm.org/docs/UsersManual.html#cl_diagnostics]
    863864
     865The options -Wpedantic  -Wall and -Wextra will enable nearly all warnings, a good start and a guide to eliminate warnings by recoding as far as possible.
     866
     867-Wall turns on the following warning flags:
     868
     869          -Waddress   
     870          -Warray-bounds (only with -O2) 
     871          -Wc++11-compat 
     872          -Wchar-subscripts 
     873          -Wenum-compare (in C/ObjC; this is on by default in C++)
     874          -Wimplicit-int (C and Objective-C only)
     875          -Wimplicit-function-declaration (C and Objective-C only)
     876          -Wcomment 
     877          -Wformat   
     878          -Wmain (only for C/ObjC and unless -ffreestanding) 
     879          -Wmaybe-uninitialized
     880          -Wmissing-braces (only for C/ObjC)
     881          -Wnonnull 
     882          -Wparentheses 
     883          -Wpointer-sign 
     884          -Wreorder   
     885          -Wreturn-type 
     886          -Wsequence-point 
     887          -Wsign-compare (only in C++) 
     888          -Wstrict-aliasing 
     889          -Wstrict-overflow=1 
     890          -Wswitch 
     891          -Wtrigraphs 
     892          -Wuninitialized 
     893          -Wunknown-pragmas 
     894          -Wunused-function 
     895          -Wunused-label     
     896          -Wunused-value     
     897          -Wunused-variable 
     898          -Wvolatile-register-var
     899
     900-Wextra
     901    This enables some extra warning flags that are not enabled by -Wall. (This option used to be called -W. The older name is still supported, but the newer name is more descriptive.)
     902
     903              -Wclobbered 
     904              -Wempty-body 
     905              -Wignored-qualifiers
     906              -Wmissing-field-initializers 
     907              -Wmissing-parameter-type (C only) 
     908              -Wold-style-declaration (C only) 
     909              -Woverride-init 
     910              -Wsign-compare 
     911              -Wtype-limits 
     912              -Wuninitialized 
     913              -Wunused-parameter (only with -Wunused or -Wall)
     914              -Wunused-but-set-parameter (only with -Wunused or -Wall) 
     915   
     916The option -Wextra also prints warning messages for the following cases:
     917
     918        A pointer is compared against integer zero with `<', `<=', `>', or `>='.
     919        (C++ only) An enumerator and a non-enumerator both appear in a conditional expression.
     920        (C++ only) Ambiguous virtual bases.
     921        (C++ only) Subscripting an array that has been declared `register'.
     922        (C++ only) Taking the address of a variable that has been declared `register'.
     923        (C++ only) A base class is not initialized in a derived class's copy constructor.
     924
     925However, it may still be necessary to suppress those that are not providing any useful guidance and cannot be reasonably eliminated.
     926
     927Many of the method discussed above for GCC should be useful.
     928
     929(Clang is more recent and so probably uses GCC >= 4.6, so the complexity of early GCC versions is absent).
     930
     931To ignore via a command line, to an option like "-Wunused-variable" add a preceeding "no-" thus: "-Wno-unused-variable".
     932
     933In a jamfile, add
     934{{{
     935<cxxflags>-Wno-unused-variable
     936<cxxflags>-Wno-maybe-uninitialized
     937...
     938}}}
    864939Clang also supports suppressing warnings by pragmas, see [http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
    865940for example
     
    875950#pragma clang diagnostic ignored "-Wmultichar"
    876951
    877 char b = 'df'; // No warning.
     952char b = 'df'; // Avoid a warning that more than one chars are provided.
    878953
    879954#pragma clang diagnostic pop
    880955}}}
    881956
     957
    882958More info needed on Clang.
    883959