From d51f45f0471c3ac75842a4bb7425f08b1b7984b3 Mon Sep 17 00:00:00 2001 From: skal Date: Thu, 12 Sep 2013 09:32:28 +0200 Subject: [PATCH] fix some warnings from static analysis http://code.google.com/p/webp/issues/detail?id=138 Change-Id: I21470e965357cc14eab356e2c477c7846ff76ef2 --- examples/cwebp.c | 4 ++-- examples/dwebp.c | 10 ++++++---- examples/stopwatch.h | 8 ++++++++ examples/vwebp.c | 15 +++++++-------- src/demux/demux.c | 12 ++++++++---- src/enc/analysis.c | 9 ++++++--- src/enc/frame.c | 1 + src/enc/picture.c | 2 ++ src/mux/muxedit.c | 10 +++++++--- src/utils/bit_writer.c | 5 ++++- 10 files changed, 51 insertions(+), 25 deletions(-) diff --git a/examples/cwebp.c b/examples/cwebp.c index cfbb47aa..4a0bd20b 100644 --- a/examples/cwebp.c +++ b/examples/cwebp.c @@ -929,7 +929,7 @@ int main(int argc, const char *argv[]) { // Read the input if (verbose) { - StopwatchReadAndReset(&stop_watch); + StopwatchReset(&stop_watch); } if (!ReadPicture(in_file, &picture, keep_alpha, (keep_metadata == 0) ? NULL : &metadata)) { @@ -983,7 +983,7 @@ int main(int argc, const char *argv[]) { // Compress if (verbose) { - StopwatchReadAndReset(&stop_watch); + StopwatchReset(&stop_watch); } if (crop != 0) { // We use self-cropping using a view. diff --git a/examples/dwebp.c b/examples/dwebp.c index da49e8e9..6ae2ae99 100644 --- a/examples/dwebp.c +++ b/examples/dwebp.c @@ -474,8 +474,9 @@ static int SaveOutput(const WebPDecBuffer* const buffer, int ok = 1; Stopwatch stop_watch; - if (verbose) - StopwatchReadAndReset(&stop_watch); + if (verbose) { + StopwatchReset(&stop_watch); + } #ifdef HAVE_WINCODEC_H needs_open_file = (format != PNG); @@ -657,8 +658,9 @@ int main(int argc, const char *argv[]) { if (!ExUtilReadFile(in_file, &data, &data_size)) return -1; - if (verbose) - StopwatchReadAndReset(&stop_watch); + if (verbose) { + StopwatchReset(&stop_watch); + } status = WebPGetFeatures(data, data_size, bitstream); if (status != VP8_STATUS_OK) { diff --git a/examples/stopwatch.h b/examples/stopwatch.h index a705481f..70eba9f6 100644 --- a/examples/stopwatch.h +++ b/examples/stopwatch.h @@ -19,6 +19,10 @@ typedef LARGE_INTEGER Stopwatch; +static WEBP_INLINE void StopwatchReset(Stopwatch* watch) { + QueryPerformanceCounter(watch); +} + static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) { const LARGE_INTEGER old_value = *watch; LARGE_INTEGER freq; @@ -37,6 +41,10 @@ static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) { typedef struct timeval Stopwatch; +static WEBP_INLINE void StopwatchReset(Stopwatch* watch) { + gettimeofday(watch, NULL); +} + static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) { const struct timeval old_value = *watch; gettimeofday(watch, NULL); diff --git a/examples/vwebp.c b/examples/vwebp.c index 5bca9418..3ff3f489 100644 --- a/examples/vwebp.c +++ b/examples/vwebp.c @@ -57,7 +57,7 @@ static struct { const char* file_name; WebPData data; - WebPDecoderConfig* config; + WebPDecoderConfig config; const WebPDecBuffer* pic; WebPDemuxer* dmux; WebPIterator curr_frame; @@ -146,7 +146,7 @@ static int ApplyColorProfile(const WebPData* const profile, static int Decode(void) { // Fills kParams.curr_frame const WebPIterator* const curr = &kParams.curr_frame; - WebPDecoderConfig* const config = kParams.config; + WebPDecoderConfig* const config = &kParams.config; WebPDecBuffer* const output_buffer = &config->output; int ok = 0; @@ -386,16 +386,15 @@ static void Help(void) { } int main(int argc, char *argv[]) { - WebPDecoderConfig config; int c; + WebPDecoderConfig* const config = &kParams.config; WebPIterator* const curr = &kParams.curr_frame; WebPIterator* const prev = &kParams.prev_frame; - if (!WebPInitDecoderConfig(&config)) { + if (!WebPInitDecoderConfig(config)) { fprintf(stderr, "Library version mismatch!\n"); return -1; } - kParams.config = &config; kParams.use_color_profile = 1; for (c = 1; c < argc; ++c) { @@ -405,9 +404,9 @@ int main(int argc, char *argv[]) { } else if (!strcmp(argv[c], "-noicc")) { kParams.use_color_profile = 0; } else if (!strcmp(argv[c], "-nofancy")) { - config.options.no_fancy_upsampling = 1; + config->options.no_fancy_upsampling = 1; } else if (!strcmp(argv[c], "-nofilter")) { - config.options.bypass_filtering = 1; + config->options.bypass_filtering = 1; } else if (!strcmp(argv[c], "-info")) { kParams.print_info = 1; } else if (!strcmp(argv[c], "-version")) { @@ -419,7 +418,7 @@ int main(int argc, char *argv[]) { (dmux_version >> 8) & 0xff, dmux_version & 0xff); return 0; } else if (!strcmp(argv[c], "-mt")) { - config.options.use_threads = 1; + config->options.use_threads = 1; } else if (argv[c][0] == '-') { printf("Unknown option '%s'\n", argv[c]); Help(); diff --git a/src/demux/demux.c b/src/demux/demux.c index 7b20487a..6c2a8ce2 100644 --- a/src/demux/demux.c +++ b/src/demux/demux.c @@ -425,6 +425,7 @@ static ParseStatus ParseSingleImage(WebPDemuxer* const dmux) { MemBuffer* const mem = &dmux->mem_; Frame* frame; ParseStatus status; + int image_added = 0; if (dmux->frames_ != NULL) return PARSE_ERROR; if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; @@ -453,12 +454,15 @@ static ParseStatus ParseSingleImage(WebPDemuxer* const dmux) { dmux->canvas_height_ = frame->height_; dmux->feature_flags_ |= frame->has_alpha_ ? ALPHA_FLAG : 0; } - AddFrame(dmux, frame); - dmux->num_frames_ = 1; - } else { - free(frame); + if (!AddFrame(dmux, frame)) { + status = PARSE_ERROR; // last frame was left incomplete + } else { + image_added = 1; + dmux->num_frames_ = 1; + } } + if (!image_added) free(frame); return status; } diff --git a/src/enc/analysis.c b/src/enc/analysis.c index 77b17ab8..0ac42f1a 100644 --- a/src/enc/analysis.c +++ b/src/enc/analysis.c @@ -153,6 +153,8 @@ static void AssignSegments(VP8Encoder* const enc, // 'int' type is ok for histo, and won't overflow int accum[NUM_MB_SEGMENTS], dist_accum[NUM_MB_SEGMENTS]; + assert(nb >= 1); + // bracket the input for (n = 0; n <= MAX_ALPHA && alphas[n] == 0; ++n) {} min_a = n; @@ -161,8 +163,9 @@ static void AssignSegments(VP8Encoder* const enc, range_a = max_a - min_a; // Spread initial centers evenly - for (n = 1, k = 0; n < 2 * nb; n += 2) { - centers[k++] = min_a + (n * range_a) / (2 * nb); + for (k = 0, n = 1; k < nb; ++k, n += 2) { + assert(n < 2 * nb); + centers[k] = min_a + (n * range_a) / (2 * nb); } for (k = 0; k < MAX_ITERS_K_MEANS; ++k) { // few iters are enough @@ -177,7 +180,7 @@ static void AssignSegments(VP8Encoder* const enc, n = 0; // track the nearest center for current 'a' for (a = min_a; a <= max_a; ++a) { if (alphas[a]) { - while (n < nb - 1 && abs(a - centers[n + 1]) < abs(a - centers[n])) { + while (n + 1 < nb && abs(a - centers[n + 1]) < abs(a - centers[n])) { n++; } map[a] = n; diff --git a/src/enc/frame.c b/src/enc/frame.c index da2fc756..c727e458 100644 --- a/src/enc/frame.c +++ b/src/enc/frame.c @@ -976,6 +976,7 @@ int VP8EncTokenLoop(VP8Encoder* const enc) { assert(enc->use_tokens_); assert(proba->use_skip_proba_ == 0); assert(rd_opt >= RD_OPT_BASIC); // otherwise, token-buffer won't be useful + assert(num_pass_left > 0); while (ok && num_pass_left-- > 0) { const int is_last_pass = (fabs(stats.dq) <= DQ_LIMIT) || diff --git a/src/enc/picture.c b/src/enc/picture.c index a53990eb..40624678 100644 --- a/src/enc/picture.c +++ b/src/enc/picture.c @@ -123,6 +123,7 @@ int WebPPictureAlloc(WebPPicture* picture) { picture->v0 = mem; mem += uv0_size; } + (void)mem; // makes the static analyzer happy } else { void* memory; const uint64_t argb_size = (uint64_t)width * height; @@ -698,6 +699,7 @@ static int ImportYUVAFromRGBA(const uint8_t* const r_ptr, if (has_alpha) { assert(step >= 4); + assert(picture->a != NULL); for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { picture->a[x + y * picture->a_stride] = diff --git a/src/mux/muxedit.c b/src/mux/muxedit.c index 21ddaf8d..1a026b45 100644 --- a/src/mux/muxedit.c +++ b/src/mux/muxedit.c @@ -403,10 +403,12 @@ static WebPMuxError GetImageInfo(const WebPMuxImage* const wpi, int* const duration, int* const width, int* const height) { const WebPChunk* const frame_frgm_chunk = wpi->header_; + WebPMuxError err; + assert(wpi != NULL); + assert(frame_frgm_chunk != NULL); // Get offsets and duration from ANMF/FRGM chunk. - const WebPMuxError err = - GetFrameFragmentInfo(frame_frgm_chunk, x_offset, y_offset, duration); + err = GetFrameFragmentInfo(frame_frgm_chunk, x_offset, y_offset, duration); if (err != WEBP_MUX_OK) return err; // Get width and height from VP8/VP8L chunk. @@ -426,10 +428,12 @@ static WebPMuxError GetImageCanvasWidthHeight( assert(wpi != NULL); assert(wpi->img_ != NULL); - if (wpi->next_) { + if (wpi->next_ != NULL) { int max_x = 0; int max_y = 0; int64_t image_area = 0; + // if we have a chain of wpi's, header_ is necessarily set + assert(wpi->header_ != NULL); // Aggregate the bounding box for animation frames & fragmented images. for (; wpi != NULL; wpi = wpi->next_) { int x_offset = 0, y_offset = 0, duration = 0, w = 0, h = 0; diff --git a/src/utils/bit_writer.c b/src/utils/bit_writer.c index 3827a13a..5d8f5f06 100644 --- a/src/utils/bit_writer.c +++ b/src/utils/bit_writer.c @@ -43,7 +43,10 @@ static int BitWriterResize(VP8BitWriter* const bw, size_t extra_size) { bw->error_ = 1; return 0; } - memcpy(new_buf, bw->buf_, bw->pos_); + if (bw->pos_ > 0) { + assert(bw->buf_ != NULL); + memcpy(new_buf, bw->buf_, bw->pos_); + } free(bw->buf_); bw->buf_ = new_buf; bw->max_pos_ = new_size;