G'day, Some time ago (perhaps 1-2 years?), I was building the Tecgraf tools suite (IM, CD and IUP), gathering the output into a file, and then try to report warnings by category.
This came about because I've been in several work environments where a warning was considered an error, and I note that Gerard Holzmann in his "Mars code" presentation, use automated/static analysers extensively to come up with over 3 million lines of code that worked when the mission was deployed [there were far too many lines of code to use traditional manual code-review/software inspection processes.] https://www.usenix.org/conference/hotdep12/workshop-program/presentation/Holzmann https://www.youtube.com/watch?v=16dQLBgOwbE The other thing is that compilers, especially GCC on the GNU/Linux platforms, have steadily become more proficient at code analysis, flow analysis, and adding warnings for constructs that had, in some cases, lead to a defect in the code (the Apple "goto Fail;" is the classic one here). So, I've written a tool to take GCC output ("parse-build.lua"), and report warnings by category. IM has not changed much over time, but I'm posting it now anyway as the start of a trio of postings. cheers, sur-behoffski (Brenton Hoff) programmer, Grouse Software
* No diagnostics for: #include expects "FILENAME" or <FILENAME> missing binary operator before token "(" converting to non-pointer type <TYPE> from NULL [-Wconversion-null] <FUNC> is deprecated [-Wdeprecated-declarations] <FUNC1> is deprecated: Use <FUNC2> instead [-Wdeprecated-declarations] assignment discards <TYPE> qualifier from pointer target type [-Wdiscarded-qualifiers] too many arguments for format [-Wformat-extra-args] <FUNC> may write a terminating nul past the end of the destination [-Wformat-overflow=] <DIRECTIVE> directive writing 1 byte into a region of size between 0 and <BYTECOUNT> [-Wformat-overflow=] <DIRECTIVE> directive writing <BYTECOUNT1> bytes into a region of size between <BYTECOUNT2> and <BYTECOUNT3> [-Wformat-overflow=] <DIRECTIVE> directive writing between <BYTECOUNT1> and <BYTECOUNT2> bytes into a region of size between <BYTECOUNT3> and <BYTECOUNT4> [-Wformat-overflow=] <DIRECTIVE> directive writing up to <BYTECOUNT1> bytes into a region of size <BYTECOUNT2> [-Wformat-overflow=] format not a string literal and no format arguments [-Wformat-security] assignment from incompatible pointer type [-Wincompatible-pointer-types] initialization from incompatible pointer type [-Wincompatible-pointer-types] passing argument <NUM> of <FUNC> from incompatible pointer type [-Wincompatible-pointer-types] <VAR> may be used uninitialized in this function [-Wmaybe-uninitialized] missing braces around initializer [-Wmissing-braces] suggest parentheses around arithmetic in operand of '|' [-Wparentheses] suggest explicit braces to avoid ambiguous 'else' [-Wparentheses] suggest parentheses around '&&' within '||' [-Wparentheses] no return statement in function returning non-void [-Wreturn-type] control reaches end of non-void function [-Wreturn-type] this 'else' clause does not guard... [-Wmisleading-indentation] this 'for' clause does not guard... [-Wmisleading-indentation] this 'while' clause does not guard... [-Wmisleading-indentation] ignoring #pragma omp critical [-Wunknown-pragmas] ignoring #pragma omp for [-Wunknown-pragmas] ignoring #pragma omp parallel [-Wunknown-pragmas] ignoring #pragma omp section [-Wunknown-pragmas] ignoring #pragma warning [-Wunknown-pragmas] dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] enumeration value <ENUM> not handled in switch [-Wswitch] <EXPRESSION> is used uninitialized in this function [-Wuninitialized] <VAR> defined but not used [-Wunused-const-variable=] <FUNC> declared <TYPE> but never defined [-Wunused-function] label <LABEL> defined but not used [-Wunused-label] value computed is not used [-Wunused-value] unused variable <VAR> [-Wunused-variable] deprecated conversion from string constant to <TYPE> [-Wwrite-strings] (End of list.) suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]: lua5/imlua_process.c:55:[Function:imluaProcessSplitComplex]: lua5/imlua_process.c:61:[Function:imluaProcessMergeComplex]: lua5/imlua_process.c:55:[Function:imluaProcessAutoCovariance]: lua5/imlua_process.c:55:[Function:imluaProcessNormalizeComponents]: lua5/imlua_process.c:55:[Function:imluaProcessNormDiffRatio]: lua5/imlua_process.c:55:[Function:imluaProcessSplitComplex]: lua5/imlua_process.c:61:[Function:imluaProcessMergeComplex]: lua5/imlua_process.c:55:[Function:imluaProcessAutoCovariance]: lua5/imlua_process.c:55:[Function:imluaProcessNormalizeComponents]: lua5/imlua_process.c:55:[Function:imluaProcessNormDiffRatio]: comparison between <ENUM1> and <ENUM2> [-Wenum-compare]: libexif/fuji/mnote-fuji-entry.c:233:[Function:mnote_fuji_entry_get_value]: ExifTag {aka const enum <anonymous>} MnoteFujiTag {aka enum _MnoteFujiTag} libexif/olympus/mnote-olympus-entry.c:430:[Function:mnote_olympus_entry_get_value]: ExifTag {aka const enum <anonymous>} MnoteOlympusTag {aka enum _MnoteOlympusTag} libexif/olympus/mnote-olympus-entry.c:500:[Function:mnote_olympus_entry_get_value]: ExifTag {aka const enum <anonymous>} MnoteOlympusTag {aka enum _MnoteOlympusTag} libexif/pentax/mnote-pentax-entry.c:347:[Function:mnote_pentax_entry_get_value]: ExifTag {aka const enum <anonymous>} MnotePentaxTag {aka enum _MnotePentaxTag} libexif/pentax/mnote-pentax-entry.c:371:[Function:mnote_pentax_entry_get_value]: ExifTag {aka const enum <anonymous>} MnotePentaxTag {aka enum _MnotePentaxTag} format <FMT> expects argument of type <TYPE1>, but argument <NUM> has type <TYPE2> [-Wformat=]: libtiff/tif_predict.c:645:[Function:PredictorEncodeTile]: %u unsigned int 4 tmsize_t {aka long unsigned int} libexif/fuji/exif-mnote-data-fuji.c:227:[Function:exif_mnote_data_fuji_load]: %u unsigned int 5 size_t {aka long unsigned int} libexif/canon/exif-mnote-data-canon.c:270:[Function:exif_mnote_data_canon_load]: %u unsigned int 5 size_t {aka long unsigned int} libexif/olympus/exif-mnote-data-olympus.c:485:[Function:exif_mnote_data_olympus_load]: %u unsigned int 5 size_t {aka long unsigned int} libexif/pentax/exif-mnote-data-pentax.c:310:[Function:exif_mnote_data_pentax_load]: %u unsigned int 5 size_t {aka long unsigned int} libjasper/base/jas_debug.c:128:[Function:jas_memdump]: %x unsigned int 3 size_t {aka long unsigned int} libjasper/jpc/jpc_mqenc.c:388:[Function:jpc_mqenc_dump]: %d int 3 long int libjasper/jpc/jpc_mqdec.c:303:[Function:jpc_mqdec_dump]: %d int 3 long int libjasper/jpc/jpc_mqdec.c:304:[Function:jpc_mqdec_dump]: %d int 3 long int implicit declaration of function <FUNC> [-Wimplicit-function-declaration]: libjasper/jpc/jpc_qmfb.c:1618:[Function:jpc_ft_synthesize]: jas_do_progress implicit declaration of function <FUNC1>; did you mean <FUNC2>? [-Wimplicit-function-declaration]: libjasper/base/jas_getopt.c:129:[Function:jas_getopt]: jas_eprintf vsnprintf libjasper/jpc/jpc_qmfb.c:1619:[Function:jpc_ft_synthesize]: jas_test_abort jas_seq_start libjasper/jpc/jpc_tsfb.c:124:[Function:jpc_tsfb_analyze]: jpc_tsfb_analyze2 jpc_tsfb_analyze libjasper/jpc/jpc_tsfb.c:151:[Function:jpc_tsfb_synthesize]: jpc_tsfb_synthesize2 jpc_tsfb_synthesize libjasper/jpc/jpc_t1dec.c:248:[Function:jpc_dec_decodecblk]: jas_eprintf vsnprintf cast to pointer from integer of different size [-Wint-to-pointer-cast]: tiff_binfile.c:74:[Function:TIFFFdOpen]: tif = TIFFClientOpen(name, mode, (thandle_t) fd, iTIFFReadProc, iTIFFWriteProc, im_format_tiff.cpp:693:[MemeberFunction:virtual void* imFileFormatTIFF::Handle(int)]: return (void*)this->tiff->tif_fd; <VAR> is usually a function [-Wmain]: libjpeg/jdmainct.c:162:[Function:alloc_funny_pointers]: main libjpeg/jdmainct.c:203:[Function:make_funny_pointers]: main libjpeg/jdmainct.c:243:[Function:set_wraparound_pointers]: main libjpeg/jdmainct.c:272:[Function:set_bottom_pointers]: main libjpeg/jdmainct.c:309:[Function:start_pass_main]: main libjpeg/jdmainct.c:349:[Function:process_data_simple_main]: main libjpeg/jdmainct.c:389:[Function:process_data_context_main]: main libjpeg/jdmainct.c:478:[Function:jinit_d_main_controller]: main libjpeg/jcmainct.c:71:[Function:start_pass_main]: main libjpeg/jcmainct.c:117:[Function:process_data_simple_main]: main libjpeg/jcmainct.c:247:[Function:jinit_c_main_controller]: main the use of `tmpnam' is dangerous, better use `mkstemp': jas_stream.c:[At:(.text+0x6c1)]: suggest parentheses around assignment used as truth value [-Wparentheses]: libjasper/base/jas_image.c:230:[Function:jas_box_alloc]: if ( box->buf = (uint_fast8_t *) jas_malloc( size ) ) comparison between pointer and zero character constant [-Wpointer-compare]: libjasper/jpc/jpc_util.c:105:[Function:jpc_atoaf]: libjasper/jpc/jpc_util.c:123:[Function:jpc_atoaf]: cast from pointer to integer of different size [-Wpointer-to-int-cast]: libjasper/base/jas_image.c:232:[Function:jas_box_alloc]: return (bool) box->buf; libjasper/jpc/jpc_t1enc.c:135:[Function:jpc_enc_enccblks]: jas_do_progress( (int) lvl, (int) (endlvls-1), "jpc: encode" ); libjasper/jpc/jpc_t1enc.c:135:[Function:jpc_enc_enccblks]: jas_do_progress( (int) lvl, (int) (endlvls-1), "jpc: encode" ); <VAR> will be initialized after [-Wreorder]: im_format_jp2.cpp:109:[Constructor:imFileFormatJP2::imFileFormatJP2(const imFormat*)]: imFileFormatJP2::image jas_image_t *image; ^~~~~ im_format_jp2.cpp:108:17: warning: 'jas_stream_t* imFileFormatJP2::stream' [-Wreorder] jas_stream_t *stream; ^~~~~~ im_format_jp2.cpp:112:3: warning: when initialized here [-Wreorder] imFileFormatJP2(const imFormat* _iformat) : imFileFormatBase(_iformat), image(0), stream(0), fmtid(-1) {} ^~~~~~~~~~~~~~~ im_format_jp2.cpp:108:[Constructor:imFileFormatJP2::imFileFormatJP2(const imFormat*)]: imFileFormatJP2::stream jas_stream_t *stream; ^~~~~~ im_format_jp2.cpp:107:7: warning: 'int imFileFormatJP2::fmtid' [-Wreorder] int fmtid; ^~~~~ im_format_jp2.cpp:112:3: warning: when initialized here [-Wreorder] imFileFormatJP2(const imFormat* _iformat) : imFileFormatBase(_iformat), image(0), stream(0), fmtid(-1) {} ^~~~~~~~~~~~~~~ case value <LABEL> not in enumerated type <ENUM> [-Wswitch]: libexif/exif-entry.c:1199:[Function:exif_entry_get_value]: 0 ExifTag {aka enum <anonymous>} libexif/exif-entry.c:1226:[Function:exif_entry_get_value]: 5 ExifTag {aka enum <anonymous>} libexif/exif-entry.c:1239:[Function:exif_entry_get_value]: 7 ExifTag {aka enum <anonymous>} this 'if' clause does not guard... [-Wmisleading-indentation]: libtiff/tif_read.c:495:[Function:TIFFFillStrip]: if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) ^~ libtiff/tif_read.c:498:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if ((tif->tif_flags&TIFF_NOREADRAW)==0) ^~ libtiff/tif_read.c:798:[Function:TIFFFillTile]: if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) ^~ libtiff/tif_read.c:801:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if ((tif->tif_flags&TIFF_NOREADRAW)==0) ^~ libtiff/tif_read.c:960:[Function:TIFFStartStrip]: if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) ^~ libtiff/tif_read.c:963:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { ^~ libtiff/tif_dirread.c:4272:[Function:EstimateStripByteCounts]: if( !_TIFFFillStriles( tif ) ) ^~ libtiff/tif_dirread.c:4275:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (td->td_stripbytecount) ^~ process/im_analyze.cpp:727:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:727:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:737:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:737:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:747:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:747:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:840:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:840:29: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:969:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:969:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:727:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:727:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:737:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:737:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:747:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:747:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:840:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:840:29: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:969:[Function:int imAnalyzeMeasurePrincipalAxis(const imImage*, const int*, const double*, const double*, int, double*, double*, double*, double*)]: if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ process/im_analyze.cpp:969:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (cm20) free(cm20); if (cm02) free(cm02); if (cm11) free(cm11); ^~ <FUNC> defined but not used [-Wunused-function]: libjasper/jpc/jpc_enc.c:886:[Function:jpc_enc_encodemainbody]: jpc_calcssexp libjasper/jpc/jpc_enc.c:870:[Function:jpc_enc_encodemainbody]: jpc_calcssmant ignoring return value of <FUNC>, declared with attribute warn_unused_result [-Wunused-result]: libjasper/base/jas_stream.c:369:[Function:jas_stream_tmpfile]: tmpnam statement with no effect [-Wunused-value]: libexif/fuji/mnote-fuji-tag.c:46:[Function:mnote_fuji_tag_get_title]: # define bindtextdomain(Domain,Directory) (Domain) libexif/fuji/mnote-fuji-tag.c:46:[Function:mnote_fuji_tag_get_description]: # define bindtextdomain(Domain,Directory) (Domain) libexif/canon/mnote-canon-tag.c:46:[Function:mnote_canon_tag_get_title]: # define bindtextdomain(Domain,Directory) (Domain) libexif/canon/mnote-canon-tag.c:46:[Function:mnote_canon_tag_get_description]: # define bindtextdomain(Domain,Directory) (Domain) libexif/olympus/mnote-olympus-tag.c:46:[Function:mnote_olympus_tag_get_title]: # define bindtextdomain(Domain,Directory) (Domain) libexif/olympus/mnote-olympus-tag.c:46:[Function:mnote_olympus_tag_get_description]: # define bindtextdomain(Domain,Directory) (Domain) libexif/pentax/mnote-pentax-tag.c:46:[Function:mnote_pentax_tag_get_title]: # define bindtextdomain(Domain,Directory) (Domain) libexif/pentax/mnote-pentax-tag.c:46:[Function:mnote_pentax_tag_get_description]: # define bindtextdomain(Domain,Directory) (Domain) libexif/exif-entry.c:46:[Function:exif_entry_get_value]: # define bindtextdomain(Domain,Directory) (Domain) libexif/exif-format.c:46:[Function:exif_format_get_name]: # define bindtextdomain(Domain,Directory) (Domain) libexif/exif-tag.c:46:[Function:exif_tag_get_title_in_ifd]: # define bindtextdomain(Domain,Directory) (Domain) libexif/exif-tag.c:46:[Function:exif_tag_get_description_in_ifd]: # define bindtextdomain(Domain,Directory) (Domain) <VAR> defined but not used [-Wunused-variable]: libjasper/jp2/jp2_cod.h:132:[#included-from:libjasper/jp2/jp2_cod.h:132]: xmp_uuid libjasper/jp2/jp2_cod.h:125:[#included-from:libjasper/jp2/jp2_cod.h:125]: msi_uuid libjasper/jp2/jp2_cod.h:132:[#included-from:libjasper/jp2/jp2_cod.h:132]: xmp_uuid variable <VAR> set but not used [-Wunused-but-set-variable]: libtiff/tif_open.c:106:[Function:TIFFClientOpen]: n libexif/olympus/mnote-olympus-entry.c:343:[Function:mnote_olympus_entry_get_value]: d libjasper/base/jas_icc.c:1072:[Function:jas_icctxtdesc_copy]: txtdesc libjasper/base/jas_icc.c:1259:[Function:jas_icclut8_copy]: lut8 libjasper/base/jas_image.c:1360:[Function:jas_image_chclrspc]: numoutchans libjasper/base/jas_image.c:1353:[Function:jas_image_chclrspc]: numinauxchans libjasper/jp2/jp2_dec.c:115:[Function:jp2_decode]: cdefd libjasper/jpc/jpc_t1enc.c:210:[Function:jpc_enc_enccblk]: rlvl libjasper/jpc/jpc_t1enc.c:205:[Function:jpc_enc_enccblk]: ret libjasper/jpc/jpc_dec.c:438:[Function:jpc_dec_process_crg]: crg libjasper/jpc/jpc_dec.c:702:[Function:jpc_dec_tileinit]: brcbgyend libjasper/jpc/jpc_enc.c:873:[Function:jpc_calcssmant]: e libjasper/jpc/jpc_enc.c:904:[Function:jpc_enc_encodemainhdr]: mctsynweight libjasper/jpc/jpc_enc.c:1121:[Function:jpc_enc_encodemainbody]: numbytes libjasper/jpc/jpc_enc.c:1107:[Function:jpc_enc_encodemainbody]: tiley libjasper/jpc/jpc_enc.c:1106:[Function:jpc_enc_encodemainbody]: tilex warning: ISO C++ forbids converting a string constant to <TYPE> [-Wwrite-strings]: im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char* im_format_tiff.cpp:[At:52]: char*
_______________________________________________ Iup-users mailing list Iup-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iup-users