Warnings when building with gcc for OpenMP
I'm trying to build the library with OpenMP support, to train my own classifier. As far as I can tell, clang doesn't support OpenMP, so I'm using gcc. Upon building, I get some interesting warnings on 10.7 that might be of interest.
$ make
USE: gcc
COMPILE FLAGS: -msse2 -D USE_OPENMP -fopenmp
LINK FLAGS: -lm -lgomp
gcc ccv_cache.c -o ccv_cache.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_cache.c: In function ‘ccv_cache_delete’:
ccv_cache.c:428: warning: comparison is always true due to limited range of data type
gcc ccv_memory.c -o ccv_memory.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/sha1/sha1.c -o 3rdparty/sha1/sha1.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kiss_fft.c -o 3rdparty/kissfft/kiss_fft.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kiss_fftnd.c -o 3rdparty/kissfft/kiss_fftnd.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kiss_fftr.c -o 3rdparty/kissfft/kiss_fftr.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kiss_fftndr.c -o 3rdparty/kissfft/kiss_fftndr.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kissf_fft.c -o 3rdparty/kissfft/kissf_fft.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kissf_fftnd.c -o 3rdparty/kissfft/kissf_fftnd.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kissf_fftr.c -o 3rdparty/kissfft/kissf_fftr.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc 3rdparty/kissfft/kissf_fftndr.c -o 3rdparty/kissfft/kissf_fftndr.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_io.c -o ccv_io.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_numeric.c -o ccv_numeric.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_numeric.c: In function ‘ccv_distance_transform’:
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1126: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1128: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1135: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
ccv_numeric.c:1137: warning: comparison is always false due to limited range of data type
gcc ccv_algebra.c -o ccv_algebra.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_algebra.c: In function ‘ccv_sat’:
ccv_algebra.c:108: warning: comparison is always false due to limited range of data type
ccv_algebra.c:108: warning: comparison is always false due to limited range of data type
gcc ccv_util.c -o ccv_util.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_util.c: In function ‘ccv_flatten’:
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c:115: warning: comparison is always false due to limited range of data type
ccv_util.c: In function ‘ccv_compress_sparse_matrix’:
ccv_util.c:407: warning: comparison is always false due to limited range of data type
ccv_util.c:407: warning: comparison is always false due to limited range of data type
ccv_util.c:422: warning: comparison is always false due to limited range of data type
ccv_util.c:422: warning: comparison is always false due to limited range of data type
ccv_util.c: In function ‘ccv_slice’:
ccv_util.c:527: warning: comparison is always false due to limited range of data type
ccv_util.c:527: warning: comparison is always false due to limited range of data type
ccv_util.c: In function ‘ccv_move’:
ccv_util.c:556: warning: comparison is always false due to limited range of data type
ccv_util.c:556: warning: comparison is always false due to limited range of data type
gcc ccv_basic.c -o ccv_basic.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_basic.c: In function ‘ccv_sobel’:
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c:143: warning: comparison is always false due to limited range of data type
ccv_basic.c: In function ‘ccv_blur’:
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:822: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
ccv_basic.c:845: warning: comparison is always false due to limited range of data type
gcc ccv_classic.c -o ccv_classic.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ccv_classic.c: In function ‘ccv_hog’:
ccv_classic.c:186: warning: comparison is always false due to limited range of data type
ccv_classic.c: In function ‘ccv_otsu’:
ccv_classic.c:359: warning: comparison is always false due to limited range of data type
gcc ccv_daisy.c -o ccv_daisy.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_sift.c -o ccv_sift.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_bbf.c -o ccv_bbf.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_mser.c -o ccv_mser.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_swt.c -o ccv_swt.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
gcc ccv_dpm.c -o ccv_dpm.o -c -O3 -ffast-math -Wall -msse2 -D USE_OPENMP -fopenmp
ar rcs libccv.a ccv_cache.o ccv_memory.o 3rdparty/sha1/sha1.o 3rdparty/kissfft/kiss_fft.o 3rdparty/kissfft/kiss_fftnd.o 3rdparty/kissfft/kiss_fftr.o 3rdparty/kissfft/kiss_fftndr.o 3rdparty/kissfft/kissf_fft.o 3rdparty/kissfft/kissf_fftnd.o 3rdparty/kissfft/kissf_fftr.o 3rdparty/kissfft/kissf_fftndr.o ccv_io.o ccv_numeric.o ccv_algebra.o ccv_util.o ccv_basic.o ccv_classic.o ccv_daisy.o ccv_sift.o ccv_bbf.o ccv_mser.o ccv_swt.o ccv_dpm.o
Yes, most of them (or all of them) are false positives, most notable one is the pinf, pf uninitialized warning. The other warnings are due to the fact ccv uses a "macro expansion" technique to deal with different data types. and unfortunately, this technique is not type-safe. To ensure it won't trigger overflow/underflow, there are a lot assert to check data types. Seems that gcc's analyzer hasn't pick up these assert properly. and for sure, I will suppress these warnings, it is a bad practice to leave a lot warnings in compilation output.