diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
index 42315da..2fddf10 100644
--- a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
+++ b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -924,7 +924,7 @@
     pFontDict = new CPDF_Dictionary;
     CFX_ByteString cmap;
     CFX_ByteString ordering;
-    int supplement;
+    int supplement = 0;
     CPDF_Array* pWidthArray = new CPDF_Array;
     switch (charset) {
       case FXFONT_CHINESEBIG5_CHARSET:
@@ -936,7 +936,8 @@
         break;
       case FXFONT_GB2312_CHARSET:
         cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
-        ordering = "GB1", supplement = 2;
+        ordering = "GB1";
+        supplement = 2;
         pWidthArray->AddInteger(7716);
         _InsertWidthArray1(pFont, pEncoding.get(), 0x20, 0x20, pWidthArray);
         pWidthArray->AddInteger(814);
diff --git a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index 1295c62..f370b86 100644
--- a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -1584,7 +1584,8 @@
                                     int nElements) {
   int width_status = 0;
   int iCurElement = 0;
-  int first_code = 0, last_code;
+  int first_code = 0;
+  int last_code = 0;
   FX_DWORD count = pArray->GetCount();
   for (FX_DWORD i = 0; i < count; i++) {
     CPDF_Object* pObj = pArray->GetElementValue(i);
diff --git a/core/fpdfapi/fpdf_page/cpdf_page.cpp b/core/fpdfapi/fpdf_page/cpdf_page.cpp
index 0da5452..2c01cd5 100644
--- a/core/fpdfapi/fpdf_page/cpdf_page.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_page.cpp
@@ -140,7 +140,12 @@
     return;
   }
   CFX_Matrix display_matrix;
-  int x0, y0, x1, y1, x2, y2;
+  int x0 = 0;
+  int y0 = 0;
+  int x1 = 0;
+  int y1 = 0;
+  int x2 = 0;
+  int y2 = 0;
   iRotate %= 4;
   switch (iRotate) {
     case 0:
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index c9f05ac..87ed097 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -41,11 +41,11 @@
   }
 }
 
-FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder,
-                             uint8_t*& dest_buf,
-                             FX_DWORD& dest_size) {
+FX_DWORD DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder,
+                            uint8_t*& dest_buf,
+                            FX_DWORD& dest_size) {
   if (!pDecoder) {
-    return (FX_DWORD)-1;
+    return static_cast<FX_DWORD>(-1);
   }
   int ncomps = pDecoder->CountComps();
   int bpc = pDecoder->GetBPC();
@@ -54,7 +54,7 @@
   int pitch = (width * ncomps * bpc + 7) / 8;
   if (height == 0 || pitch > (1 << 30) / height) {
     delete pDecoder;
-    return -1;
+    return static_cast<FX_DWORD>(-1);
   }
   dest_buf = FX_Alloc2D(uint8_t, pitch, height);
   dest_size = pitch * height;  // Safe since checked alloc returned.
@@ -88,7 +88,7 @@
   if (decoder == "CCITTFaxDecode" || decoder == "CCF") {
     ICodec_ScanlineDecoder* pDecoder =
         FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);
-    return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+    return DecodeAllScanlines(pDecoder, dest_buf, dest_size);
   }
   if (decoder == "ASCII85Decode" || decoder == "A85") {
     return A85Decode(src_buf, limit, dest_buf, dest_size);
@@ -109,7 +109,7 @@
         CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
             src_buf, limit, width, height, 0,
             pParam ? pParam->GetIntegerBy("ColorTransform", 1) : 1);
-    return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+    return DecodeAllScanlines(pDecoder, dest_buf, dest_size);
   }
   if (decoder == "RunLengthDecode" || decoder == "RL") {
     return RunLengthDecode(src_buf, limit, dest_buf, dest_size);
diff --git a/core/fpdfapi/fpdf_parser/cpdf_parser.cpp b/core/fpdfapi/fpdf_parser/cpdf_parser.cpp
index c9b8583..3ee53e6 100644
--- a/core/fpdfapi/fpdf_parser/cpdf_parser.cpp
+++ b/core/fpdfapi/fpdf_parser/cpdf_parser.cpp
@@ -1538,9 +1538,8 @@
   FX_FILESIZE dwFirstXRefOffset = m_pSyntax->SavePos();
 
   FX_BOOL bXRefRebuilt = FALSE;
-  FX_BOOL bLoadV4 = FALSE;
-  if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE)) &&
-      !LoadCrossRefV5(&dwFirstXRefOffset, TRUE)) {
+  FX_BOOL bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE);
+  if (!bLoadV4 && !LoadCrossRefV5(&dwFirstXRefOffset, TRUE)) {
     if (!RebuildCrossRef())
       return FORMAT_ERROR;
 
diff --git a/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
index f7fc309..c91e99b 100644
--- a/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -177,14 +177,14 @@
       old = dest_size;
       dest_size += src_buf[i] + 1;
       if (dest_size < old) {
-        return (FX_DWORD)-1;
+        return static_cast<FX_DWORD>(-1);
       }
       i += src_buf[i] + 2;
     } else if (src_buf[i] > 128) {
       old = dest_size;
       dest_size += 257 - src_buf[i];
       if (dest_size < old) {
-        return (FX_DWORD)-1;
+        return static_cast<FX_DWORD>(-1);
       }
       i += 2;
     } else {
@@ -192,7 +192,7 @@
     }
   }
   if (dest_size >= _STREAM_MAX_SIZE_) {
-    return -1;
+    return static_cast<FX_DWORD>(-1);
   }
   dest_buf = FX_Alloc(uint8_t, dest_size);
   i = 0;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index fe72bb3..6741d1a 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -140,12 +140,12 @@
   text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
   image_matrix.Concat(text_matrix);
   CFX_DIBitmap* pResBitmap = NULL;
-  int left, top;
+  int left = 0;
+  int top = 0;
   if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 &&
       FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {
-    int top_line, bottom_line;
-    top_line = _DetectFirstLastScan(pBitmap, TRUE);
-    bottom_line = _DetectFirstLastScan(pBitmap, FALSE);
+    int top_line = _DetectFirstLastScan(pBitmap, TRUE);
+    int bottom_line = _DetectFirstLastScan(pBitmap, FALSE);
     if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {
       FX_FLOAT top_y = image_matrix.d + image_matrix.f;
       FX_FLOAT bottom_y = image_matrix.f;
@@ -167,7 +167,6 @@
       } else {
         left = FXSYS_round(image_matrix.e);
       }
-    } else {
     }
   }
   if (!pResBitmap) {
diff --git a/core/fpdfdoc/doc_ap.cpp b/core/fpdfdoc/doc_ap.cpp
index 43dcfb4..e64080d 100644
--- a/core/fpdfdoc/doc_ap.cpp
+++ b/core/fpdfdoc/doc_ap.cpp
@@ -303,8 +303,8 @@
     pDRDict = pFormDict->GetDictBy("DR");
     bUseFormRes = TRUE;
   }
-  CPDF_Dictionary* pDRFontDict = NULL;
-  if (pDRDict && (pDRFontDict = pDRDict->GetDictBy("Font"))) {
+  CPDF_Dictionary* pDRFontDict = pDRDict ? pDRDict->GetDictBy("Font") : nullptr;
+  if (pDRFontDict) {
     pFontDict = pDRFontDict->GetDictBy(sFontName.Mid(1));
     if (!pFontDict && !bUseFormRes) {
       pDRDict = pFormDict->GetDictBy("DR");
diff --git a/core/fxcodec/codec/codec_int.h b/core/fxcodec/codec/codec_int.h
index d2f44dd..d19a694 100644
--- a/core/fxcodec/codec/codec_int.h
+++ b/core/fxcodec/codec/codec_int.h
@@ -47,7 +47,6 @@
   ~CCodec_ScanlineDecoder() override;
 
   // ICodec_ScanlineDecoder
-  FX_DWORD GetSrcOffset() override { return -1; }
   void DownScale(int dest_width, int dest_height) override;
   const uint8_t* GetScanline(int line) override;
   FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) override;
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index 49a4f34..27416f1 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -147,7 +147,7 @@
   m_Early = bEarlyChange ? 1 : 0;
   m_nCodes = 0;
   FX_DWORD old_code = (FX_DWORD)-1;
-  uint8_t last_char;
+  uint8_t last_char = 0;
   while (1) {
     if (m_InPos + m_CodeLen > src_size * 8) {
       break;
@@ -942,7 +942,7 @@
       offset = src_size;
       int err = decoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);
       if (err || dest_size == 0 || dest_size + 1 < dest_size) {
-        return -1;
+        return static_cast<FX_DWORD>(-1);
       }
     }
     {
@@ -965,7 +965,7 @@
     ret =
         TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
   }
-  return ret ? offset : -1;
+  return ret ? offset : static_cast<FX_DWORD>(-1);
 }
 FX_BOOL CCodec_FlateModule::Encode(const uint8_t* src_buf,
                                    FX_DWORD src_size,
diff --git a/core/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/fxcodec/codec/fx_codec_jpx_opj.cpp
index aaa8938..a57b93d 100644
--- a/core/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -24,16 +24,17 @@
 static void fx_info_callback(const char* msg, void* client_data) {
   (void)client_data;
 }
+
 OPJ_SIZE_T opj_read_from_memory(void* p_buffer,
                                 OPJ_SIZE_T nb_bytes,
                                 void* p_user_data) {
   DecodeData* srcData = static_cast<DecodeData*>(p_user_data);
   if (!srcData || !srcData->src_data || srcData->src_size == 0) {
-    return -1;
+    return static_cast<OPJ_SIZE_T>(-1);
   }
   // Reads at EOF return an error code.
   if (srcData->offset >= srcData->src_size) {
-    return -1;
+    return static_cast<OPJ_SIZE_T>(-1);
   }
   OPJ_SIZE_T bufferLength = srcData->src_size - srcData->offset;
   OPJ_SIZE_T readlength = nb_bytes < bufferLength ? nb_bytes : bufferLength;
@@ -41,16 +42,17 @@
   srcData->offset += readlength;
   return readlength;
 }
+
 OPJ_SIZE_T opj_write_from_memory(void* p_buffer,
                                  OPJ_SIZE_T nb_bytes,
                                  void* p_user_data) {
   DecodeData* srcData = static_cast<DecodeData*>(p_user_data);
   if (!srcData || !srcData->src_data || srcData->src_size == 0) {
-    return -1;
+    return static_cast<OPJ_SIZE_T>(-1);
   }
   // Writes at EOF return an error code.
   if (srcData->offset >= srcData->src_size) {
-    return -1;
+    return static_cast<OPJ_SIZE_T>(-1);
   }
   OPJ_SIZE_T bufferLength = srcData->src_size - srcData->offset;
   OPJ_SIZE_T writeLength = nb_bytes < bufferLength ? nb_bytes : bufferLength;
@@ -58,17 +60,18 @@
   srcData->offset += writeLength;
   return writeLength;
 }
+
 OPJ_OFF_T opj_skip_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data) {
   DecodeData* srcData = static_cast<DecodeData*>(p_user_data);
   if (!srcData || !srcData->src_data || srcData->src_size == 0) {
-    return -1;
+    return static_cast<OPJ_OFF_T>(-1);
   }
   // Offsets are signed and may indicate a negative skip. Do not support this
   // because of the strange return convention where either bytes skipped or
   // -1 is returned. Following that convention, a successful relative seek of
   // -1 bytes would be required to to give the same result as the error case.
   if (nb_bytes < 0) {
-    return -1;
+    return static_cast<OPJ_OFF_T>(-1);
   }
   // FIXME: use std::make_unsigned<OPJ_OFF_T>::type once c++11 lib is OK'd.
   uint64_t unsignedNbBytes = static_cast<uint64_t>(nb_bytes);
@@ -89,6 +92,7 @@
   }
   return nb_bytes;
 }
+
 OPJ_BOOL opj_seek_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data) {
   DecodeData* srcData = static_cast<DecodeData*>(p_user_data);
   if (!srcData || !srcData->src_data || srcData->src_size == 0) {
diff --git a/core/fxcodec/codec/fx_codec_tiff.cpp b/core/fxcodec/codec/fx_codec_tiff.cpp
index 2af92f2..0312622 100644
--- a/core/fxcodec/codec/fx_codec_tiff.cpp
+++ b/core/fxcodec/codec/fx_codec_tiff.cpp
@@ -122,20 +122,20 @@
     case 2:
       if (pTiffContext->isDecoder) {
         if (pTiffContext->io.in->GetSize() < (FX_FILESIZE)offset) {
-          return -1;
+          return static_cast<toff_t>(-1);
         }
         pTiffContext->offset =
             (FX_DWORD)(pTiffContext->io.in->GetSize() - offset);
       } else {
         if (pTiffContext->io.out->GetSize() < (FX_FILESIZE)offset) {
-          return -1;
+          return static_cast<toff_t>(-1);
         }
         pTiffContext->offset =
             (FX_DWORD)(pTiffContext->io.out->GetSize() - offset);
       }
       break;
     default:
-      return -1;
+      return static_cast<toff_t>(-1);
   }
   ASSERT(pTiffContext->isDecoder ? (pTiffContext->offset <=
                                     (FX_DWORD)pTiffContext->io.in->GetSize())
diff --git a/core/fxcodec/jbig2/JBig2_Context.cpp b/core/fxcodec/jbig2/JBig2_Context.cpp
index 89157b9..805a102 100644
--- a/core/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/fxcodec/jbig2/JBig2_Context.cpp
@@ -201,7 +201,7 @@
 }
 int32_t CJBig2_Context::Continue(IFX_Pause* pPause) {
   m_ProcessingStatus = FXCODEC_STATUS_DECODE_READY;
-  int32_t nRet;
+  int32_t nRet = 0;
   if (m_PauseStep <= 1) {
     nRet = decode_EmbedOrgnazation(pPause);
   } else if (m_PauseStep == 2) {
@@ -683,14 +683,14 @@
   }
   pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;
 
-  uint8_t cSBHUFFFS;
-  uint8_t cSBHUFFDS;
-  uint8_t cSBHUFFDT;
-  uint8_t cSBHUFFRDW;
-  uint8_t cSBHUFFRDH;
-  uint8_t cSBHUFFRDX;
-  uint8_t cSBHUFFRDY;
-  uint8_t cSBHUFFRSIZE;
+  uint8_t cSBHUFFFS = 0;
+  uint8_t cSBHUFFDS = 0;
+  uint8_t cSBHUFFDT = 0;
+  uint8_t cSBHUFFRDW = 0;
+  uint8_t cSBHUFFRDH = 0;
+  uint8_t cSBHUFFRDX = 0;
+  uint8_t cSBHUFFRDY = 0;
+  uint8_t cSBHUFFRSIZE = 0;
   if (pTRD->SBHUFF == 1) {
     if (m_pStream->readShortInteger(&wFlags) != 0)
       return JBIG2_ERROR_TOO_SHORT;
diff --git a/core/fxcodec/jbig2/JBig2_Image.cpp b/core/fxcodec/jbig2/JBig2_Image.cpp
index 311c382..dddc1d2 100644
--- a/core/fxcodec/jbig2/JBig2_Image.cpp
+++ b/core/fxcodec/jbig2/JBig2_Image.cpp
@@ -665,74 +665,46 @@
                                      int32_t y,
                                      JBig2ComposeOp op,
                                      const FX_RECT* pSrcRect) {
-  int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords,
-      lineLeft;
-  FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR,
-      maskM;
-  uint8_t *lineSrc, *lineDst, *sp, *dp;
-  int32_t sw, sh;
   if (!m_pData) {
     return FALSE;
   }
+  // TODO(weili): Check whether the range check is correct. Should x>=1048576?
   if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
     return FALSE;
   }
-  sw = pSrcRect->Width();
-  sh = pSrcRect->Height();
-  if (y < 0) {
-    ys0 = -y;
-  } else {
-    ys0 = 0;
-  }
-  if (y + sh > pDst->m_nHeight) {
-    ys1 = pDst->m_nHeight - y;
-  } else {
-    ys1 = sh;
-  }
-  if (x < 0) {
-    xs0 = -x;
-  } else {
-    xs0 = 0;
-  }
-  if (x + sw > pDst->m_nWidth) {
-    xs1 = pDst->m_nWidth - x;
-  } else {
-    xs1 = sw;
-  }
+  int32_t sw = pSrcRect->Width();
+  int32_t sh = pSrcRect->Height();
+  int32_t ys0 = y < 0 ? -y : 0;
+  int32_t ys1 = y + sh > pDst->m_nHeight ? pDst->m_nHeight - y : sh;
+  int32_t xs0 = x < 0 ? -x : 0;
+  int32_t xs1 = x + sw > pDst->m_nWidth ? pDst->m_nWidth - x : sw;
   if ((ys0 >= ys1) || (xs0 >= xs1)) {
     return 0;
   }
-  w = xs1 - xs0;
-  h = ys1 - ys0;
-  if (y < 0) {
-    yd0 = 0;
-  } else {
-    yd0 = y;
-  }
-  if (x < 0) {
-    xd0 = 0;
-  } else {
-    xd0 = x;
-  }
-  xd1 = xd0 + w;
-  yd1 = yd0 + h;
-  d1 = xd0 & 31;
-  d2 = xd1 & 31;
-  s1 = xs0 & 31;
-  maskL = 0xffffffff >> d1;
-  maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
-  maskM = maskL & maskR;
-  lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride +
-            (((xs0 + pSrcRect->left) >> 5) << 2);
-  lineLeft = m_nStride - ((xs0 >> 5) << 2);
-  lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
+  int32_t w = xs1 - xs0;
+  int32_t h = ys1 - ys0;
+  int32_t yd0 = y < 0 ? 0 : y;
+  int32_t xd0 = x < 0 ? 0 : x;
+  int32_t xd1 = xd0 + w;
+  int32_t yd1 = yd0 + h;
+  int32_t d1 = xd0 & 31;
+  int32_t d2 = xd1 & 31;
+  int32_t s1 = xs0 & 31;
+  int32_t maskL = 0xffffffff >> d1;
+  int32_t maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
+  int32_t maskM = maskL & maskR;
+  uint8_t* lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride +
+                     (((xs0 + pSrcRect->left) >> 5) << 2);
+  int32_t lineLeft = m_nStride - ((xs0 >> 5) << 2);
+  uint8_t* lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
   if ((xd0 & ~31) == ((xd1 - 1) & ~31)) {
     if ((xs0 & ~31) == ((xs1 - 1) & ~31)) {
       if (s1 > d1) {
-        shift = s1 - d1;
-        for (yy = yd0; yy < yd1; yy++) {
-          tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
-          tmp2 = JBIG2_GETDWORD(lineDst);
+        FX_DWORD shift = s1 - d1;
+        for (int32_t yy = yd0; yy < yd1; yy++) {
+          FX_DWORD tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
+          FX_DWORD tmp2 = JBIG2_GETDWORD(lineDst);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
@@ -758,10 +730,11 @@
           lineDst += pDst->m_nStride;
         }
       } else {
-        shift = d1 - s1;
-        for (yy = yd0; yy < yd1; yy++) {
-          tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
-          tmp2 = JBIG2_GETDWORD(lineDst);
+        FX_DWORD shift = d1 - s1;
+        for (int32_t yy = yd0; yy < yd1; yy++) {
+          FX_DWORD tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
+          FX_DWORD tmp2 = JBIG2_GETDWORD(lineDst);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
@@ -788,12 +761,13 @@
         }
       }
     } else {
-      shift1 = s1 - d1;
-      shift2 = 32 - shift1;
-      for (yy = yd0; yy < yd1; yy++) {
-        tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) |
-               (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
-        tmp2 = JBIG2_GETDWORD(lineDst);
+      FX_DWORD shift1 = s1 - d1;
+      FX_DWORD shift2 = 32 - shift1;
+      for (int32_t yy = yd0; yy < yd1; yy++) {
+        FX_DWORD tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) |
+                        (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
+        FX_DWORD tmp2 = JBIG2_GETDWORD(lineDst);
+        FX_DWORD tmp = 0;
         switch (op) {
           case JBIG2_COMPOSE_OR:
             tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
@@ -821,16 +795,17 @@
     }
   } else {
     if (s1 > d1) {
-      shift1 = s1 - d1;
-      shift2 = 32 - shift1;
-      middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
-      for (yy = yd0; yy < yd1; yy++) {
-        sp = lineSrc;
-        dp = lineDst;
+      FX_DWORD shift1 = s1 - d1;
+      FX_DWORD shift2 = 32 - shift1;
+      int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+      for (int32_t yy = yd0; yy < yd1; yy++) {
+        uint8_t* sp = lineSrc;
+        uint8_t* dp = lineDst;
         if (d1 != 0) {
-          tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
-                 (JBIG2_GETDWORD(sp + 4) >> shift2);
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
+                          (JBIG2_GETDWORD(sp + 4) >> shift2);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
@@ -855,10 +830,11 @@
           sp += 4;
           dp += 4;
         }
-        for (xx = 0; xx < middleDwords; xx++) {
-          tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
-                 (JBIG2_GETDWORD(sp + 4) >> shift2);
-          tmp2 = JBIG2_GETDWORD(dp);
+        for (int32_t xx = 0; xx < middleDwords; xx++) {
+          FX_DWORD tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
+                          (JBIG2_GETDWORD(sp + 4) >> shift2);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = tmp1 | tmp2;
@@ -884,11 +860,12 @@
           dp += 4;
         }
         if (d2 != 0) {
-          tmp1 =
+          FX_DWORD tmp1 =
               (JBIG2_GETDWORD(sp) << shift1) |
               (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
                shift2);
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
@@ -915,13 +892,14 @@
         lineDst += pDst->m_nStride;
       }
     } else if (s1 == d1) {
-      middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
-      for (yy = yd0; yy < yd1; yy++) {
-        sp = lineSrc;
-        dp = lineDst;
+      int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+      for (int32_t yy = yd0; yy < yd1; yy++) {
+        uint8_t* sp = lineSrc;
+        uint8_t* dp = lineDst;
         if (d1 != 0) {
-          tmp1 = JBIG2_GETDWORD(sp);
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp1 = JBIG2_GETDWORD(sp);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
@@ -946,9 +924,10 @@
           sp += 4;
           dp += 4;
         }
-        for (xx = 0; xx < middleDwords; xx++) {
-          tmp1 = JBIG2_GETDWORD(sp);
-          tmp2 = JBIG2_GETDWORD(dp);
+        for (int32_t xx = 0; xx < middleDwords; xx++) {
+          FX_DWORD tmp1 = JBIG2_GETDWORD(sp);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = tmp1 | tmp2;
@@ -974,8 +953,9 @@
           dp += 4;
         }
         if (d2 != 0) {
-          tmp1 = JBIG2_GETDWORD(sp);
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp1 = JBIG2_GETDWORD(sp);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
@@ -1002,15 +982,16 @@
         lineDst += pDst->m_nStride;
       }
     } else {
-      shift1 = d1 - s1;
-      shift2 = 32 - shift1;
-      middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
-      for (yy = yd0; yy < yd1; yy++) {
-        sp = lineSrc;
-        dp = lineDst;
+      FX_DWORD shift1 = d1 - s1;
+      FX_DWORD shift2 = 32 - shift1;
+      int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+      for (int32_t yy = yd0; yy < yd1; yy++) {
+        uint8_t* sp = lineSrc;
+        uint8_t* dp = lineDst;
         if (d1 != 0) {
-          tmp1 = JBIG2_GETDWORD(sp) >> shift1;
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp1 = JBIG2_GETDWORD(sp) >> shift1;
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
@@ -1034,10 +1015,11 @@
           dp[3] = (uint8_t)tmp;
           dp += 4;
         }
-        for (xx = 0; xx < middleDwords; xx++) {
-          tmp1 = (JBIG2_GETDWORD(sp) << shift2) |
-                 ((JBIG2_GETDWORD(sp + 4)) >> shift1);
-          tmp2 = JBIG2_GETDWORD(dp);
+        for (int32_t xx = 0; xx < middleDwords; xx++) {
+          FX_DWORD tmp1 = (JBIG2_GETDWORD(sp) << shift2) |
+                          ((JBIG2_GETDWORD(sp + 4)) >> shift1);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = tmp1 | tmp2;
@@ -1063,11 +1045,12 @@
           dp += 4;
         }
         if (d2 != 0) {
-          tmp1 =
+          FX_DWORD tmp1 =
               (JBIG2_GETDWORD(sp) << shift2) |
               (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
                shift1);
-          tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp2 = JBIG2_GETDWORD(dp);
+          FX_DWORD tmp = 0;
           switch (op) {
             case JBIG2_COMPOSE_OR:
               tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
diff --git a/core/fxcodec/jbig2/JBig2_TrdProc.cpp b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
index 401249e..1a078a1 100644
--- a/core/fxcodec/jbig2/JBig2_TrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_TrdProc.cpp
@@ -15,48 +15,39 @@
 
 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream,
                                              JBig2ArithCtx* grContext) {
-  int32_t STRIPT, FIRSTS;
-  FX_DWORD NINSTANCES;
-  int32_t DT, DFS, CURS;
-  int32_t SI, TI;
-  CJBig2_Image* IBI;
-  FX_DWORD WI, HI;
-  int32_t IDS;
-  FX_BOOL RI;
-  int32_t RDWI, RDHI, RDXI, RDYI;
-  CJBig2_Image* IBOI;
-  FX_DWORD WOI, HOI;
-  FX_BOOL bFirst;
-  FX_DWORD nTmp;
-  int32_t nVal, nBits;
   std::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder(
       new CJBig2_HuffmanDecoder(pStream));
   std::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
   SBREG->fill(SBDEFPIXEL);
+  int32_t STRIPT;
   if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0)
     return nullptr;
 
   STRIPT *= SBSTRIPS;
   STRIPT = -STRIPT;
-  FIRSTS = 0;
-  NINSTANCES = 0;
+  FX_DWORD NINSTANCES = 0;
   while (NINSTANCES < SBNUMINSTANCES) {
+    int32_t DT;
     if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0)
       return nullptr;
 
     DT *= SBSTRIPS;
     STRIPT = STRIPT + DT;
-    bFirst = TRUE;
+    bool bFirst = true;
+    int32_t FIRSTS = 0;
+    int32_t CURS = 0;
     for (;;) {
       if (bFirst) {
+        int32_t DFS;
         if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0)
           return nullptr;
 
         FIRSTS = FIRSTS + DFS;
         CURS = FIRSTS;
-        bFirst = FALSE;
+        bFirst = false;
       } else {
-        nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
+        int32_t IDS;
+        int32_t nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
         if (nVal == JBIG2_OOB) {
           break;
         } else if (nVal != 0) {
@@ -67,20 +58,22 @@
       }
       uint8_t CURT = 0;
       if (SBSTRIPS != 1) {
-        nTmp = 1;
+        FX_DWORD nTmp = 1;
         while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
           nTmp++;
         }
+        int32_t nVal;
         if (pStream->readNBits(nTmp, &nVal) != 0)
           return nullptr;
 
         CURT = nVal;
       }
-      TI = STRIPT + CURT;
-      nVal = 0;
-      nBits = 0;
+      int32_t TI = STRIPT + CURT;
+      int32_t nVal = 0;
+      int32_t nBits = 0;
       FX_DWORD IDI;
       for (;;) {
+        FX_DWORD nTmp;
         if (pStream->read1Bit(&nTmp) != 0)
           return nullptr;
 
@@ -96,16 +89,18 @@
           break;
         }
       }
-      if (SBREFINE == 0) {
-        RI = 0;
-      } else {
-        if (pStream->read1Bit(&RI) != 0) {
-          return nullptr;
-        }
+      FX_BOOL RI = 0;
+      if (SBREFINE != 0 && pStream->read1Bit(&RI) != 0) {
+        return nullptr;
       }
+      CJBig2_Image* IBI = nullptr;
       if (RI == 0) {
         IBI = SBSYMS[IDI];
       } else {
+        int32_t RDWI;
+        int32_t RDHI;
+        int32_t RDXI;
+        int32_t RDYI;
         if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) ||
             (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) ||
             (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) ||
@@ -114,13 +109,13 @@
           return nullptr;
         }
         pStream->alignByte();
-        nTmp = pStream->getOffset();
-        IBOI = SBSYMS[IDI];
+        FX_DWORD nTmp = pStream->getOffset();
+        CJBig2_Image* IBOI = SBSYMS[IDI];
         if (!IBOI)
           return nullptr;
 
-        WOI = IBOI->m_nWidth;
-        HOI = IBOI->m_nHeight;
+        FX_DWORD WOI = IBOI->m_nWidth;
+        FX_DWORD HOI = IBOI->m_nHeight;
         if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0)
           return nullptr;
 
@@ -155,8 +150,8 @@
       if (!IBI) {
         continue;
       }
-      WI = IBI->m_nWidth;
-      HI = IBI->m_nHeight;
+      FX_DWORD WI = IBI->m_nWidth;
+      FX_DWORD HI = IBI->m_nHeight;
       if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) ||
                               (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
         CURS = CURS + WI - 1;
@@ -164,7 +159,7 @@
                                      (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
         CURS = CURS + HI - 1;
       }
-      SI = CURS;
+      int32_t SI = CURS;
       if (TRANSPOSED == 0) {
         switch (REFCORNER) {
           case JBIG2_CORNER_TOPLEFT:
@@ -277,7 +272,7 @@
   int32_t FIRSTS = 0;
   FX_DWORD NINSTANCES = 0;
   while (NINSTANCES < SBNUMINSTANCES) {
-    int32_t CURS;
+    int32_t CURS = 0;
     int32_t DT;
     pIADT->decode(pArithDecoder, &DT);
     DT *= SBSTRIPS;
diff --git a/core/fxcrt/fx_basic_maps.cpp b/core/fxcrt/fx_basic_maps.cpp
index eb4f286..bad1868 100644
--- a/core/fxcrt/fx_basic_maps.cpp
+++ b/core/fxcrt/fx_basic_maps.cpp
@@ -39,19 +39,16 @@
   ASSERT(pAssocRet);
   if (pAssocRet == (CAssoc*)-1) {
     for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++) {
-      if ((pAssocRet = m_pHashTable[nBucket]))
+      pAssocRet = m_pHashTable[nBucket];
+      if (pAssocRet)
         break;
     }
     ASSERT(pAssocRet);
   }
-  CAssoc* pAssocNext;
-  if ((pAssocNext = pAssocRet->pNext) == NULL) {
-    for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1;
-         nBucket < m_nHashTableSize; nBucket++) {
-      if ((pAssocNext = m_pHashTable[nBucket])) {
-        break;
-      }
-    }
+  CAssoc* pAssocNext = pAssocRet->pNext;
+  for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1;
+       nBucket < m_nHashTableSize && !pAssocNext; nBucket++) {
+    pAssocNext = m_pHashTable[nBucket];
   }
   rNextPosition = (FX_POSITION)pAssocNext;
   rKey = pAssocRet->key;
diff --git a/core/fxcrt/fx_basic_wstring.cpp b/core/fxcrt/fx_basic_wstring.cpp
index 95b761b..8282bd5 100644
--- a/core/fxcrt/fx_basic_wstring.cpp
+++ b/core/fxcrt/fx_basic_wstring.cpp
@@ -640,13 +640,12 @@
   FX_STRSIZE nCount = 0;
   FX_WCHAR* lpszStart = m_pData->m_String;
   FX_WCHAR* lpszEnd = m_pData->m_String + m_pData->m_nDataLength;
-  FX_WCHAR* lpszTarget;
-  {
-    while ((lpszTarget = (FX_WCHAR*)FXSYS_wcsstr(lpszStart, lpszOld)) &&
-           lpszStart < lpszEnd) {
-      nCount++;
-      lpszStart = lpszTarget + nSourceLen;
-    }
+  while (lpszStart < lpszEnd) {
+    FX_WCHAR* lpszTarget = FXSYS_wcsstr(lpszStart, lpszOld);
+    if (!lpszTarget)
+      break;
+    nCount++;
+    lpszStart = lpszTarget + nSourceLen;
   }
   if (nCount > 0) {
     CopyBeforeWrite();
@@ -667,9 +666,10 @@
     lpszStart = m_pData->m_String;
     lpszEnd = m_pData->m_String + std::max(m_pData->m_nDataLength, nNewLength);
     {
-      while ((lpszTarget = (FX_WCHAR*)FXSYS_wcsstr(lpszStart, lpszOld)) !=
-                 NULL &&
-             lpszStart < lpszEnd) {
+      while (lpszStart < lpszEnd) {
+        FX_WCHAR* lpszTarget = FXSYS_wcsstr(lpszStart, lpszOld);
+        if (!lpszTarget)
+          break;
         FX_STRSIZE nBalance =
             nOldLength -
             (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);
diff --git a/core/fxge/dib/fx_dib_composite.cpp b/core/fxge/dib/fx_dib_composite.cpp
index 0bf67cc..5bfe46e 100644
--- a/core/fxge/dib/fx_dib_composite.cpp
+++ b/core/fxge/dib/fx_dib_composite.cpp
@@ -200,7 +200,9 @@
                 const uint8_t* src_scan,
                 uint8_t* dest_scan,
                 int results[3]) {
-  _RGB src, back, result;
+  _RGB src;
+  _RGB back;
+  _RGB result = {0, 0, 0};
   src.red = src_scan[2];
   src.green = src_scan[1];
   src.blue = src_scan[0];
@@ -291,7 +293,6 @@
 
   if (blend_type) {
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-    int blended_color;
     if (src_alpha_scan) {
       for (int col = 0; col < pixel_count; col++) {
         uint8_t back_alpha = *dst_alpha_scan;
@@ -332,12 +333,10 @@
         } else {
           gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
         }
-        if (bNonseparableBlend) {
-          blended_color =
-              blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-        }
-        gray = bNonseparableBlend ? blended_color
-                                  : _BLEND(blend_type, *dest_scan, gray);
+        if (bNonseparableBlend)
+          gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+        else
+          gray = _BLEND(blend_type, *dest_scan, gray);
         *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
         dest_scan++;
         dst_alpha_scan++;
@@ -498,7 +497,6 @@
 
   if (blend_type) {
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-    int blended_color;
     if (src_alpha_scan) {
       for (int col = 0; col < pixel_count; col++) {
         int src_alpha = *src_alpha_scan++;
@@ -511,12 +509,10 @@
           else
             gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
 
-          if (bNonseparableBlend) {
-            blended_color =
-                blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-          }
-          gray = bNonseparableBlend ? blended_color
-                                    : _BLEND(blend_type, *dest_scan, gray);
+          if (bNonseparableBlend)
+            gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+          else
+            gray = _BLEND(blend_type, *dest_scan, gray);
           *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
         }
         dest_scan++;
@@ -534,12 +530,10 @@
           else
             gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
 
-          if (bNonseparableBlend) {
-            blended_color =
-                blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-          }
-          gray = bNonseparableBlend ? blended_color
-                                    : _BLEND(blend_type, *dest_scan, gray);
+          if (bNonseparableBlend)
+            gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+          else
+            gray = _BLEND(blend_type, *dest_scan, gray);
           *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
         }
         dest_scan++;
@@ -599,19 +593,16 @@
   }
   if (blend_type) {
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-    int blended_color;
     for (int col = 0; col < pixel_count; col++) {
       if (pIccTransform) {
         pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
       } else {
         gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
       }
-      if (bNonseparableBlend) {
-        blended_color =
-            blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-      }
-      gray = bNonseparableBlend ? blended_color
-                                : _BLEND(blend_type, *dest_scan, gray);
+      if (bNonseparableBlend)
+        gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+      else
+        gray = _BLEND(blend_type, *dest_scan, gray);
       if (clip_scan && clip_scan[col] < 255) {
         *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
       } else {
@@ -650,7 +641,6 @@
     pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
   }
   if (blend_type) {
-    int blended_color;
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
     for (int col = 0; col < pixel_count; col++) {
       int back_alpha = *dest_alpha_scan;
@@ -685,12 +675,10 @@
       } else {
         gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
       }
-      if (bNonseparableBlend) {
-        blended_color =
-            blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-      }
-      gray = bNonseparableBlend ? blended_color
-                                : _BLEND(blend_type, *dest_scan, gray);
+      if (bNonseparableBlend)
+        gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+      else
+        gray = _BLEND(blend_type, *dest_scan, gray);
       *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
       dest_scan++;
       src_scan += src_Bpp;
@@ -1849,19 +1837,16 @@
   if (src_alpha_scan) {
     if (blend_type) {
       FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-      int blended_color;
       for (int col = 0; col < pixel_count; col++) {
         uint8_t gray = pPalette[*src_scan];
         int src_alpha = *src_alpha_scan++;
         if (clip_scan) {
           src_alpha = clip_scan[col] * src_alpha / 255;
         }
-        if (bNonseparableBlend) {
-          blended_color =
-              blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-        }
-        gray = bNonseparableBlend ? blended_color
-                                  : _BLEND(blend_type, *dest_scan, gray);
+        if (bNonseparableBlend)
+          gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+        else
+          gray = _BLEND(blend_type, *dest_scan, gray);
         if (src_alpha) {
           *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
         } else {
@@ -1889,15 +1874,12 @@
   } else {
     if (blend_type) {
       FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-      int blended_color;
       for (int col = 0; col < pixel_count; col++) {
         uint8_t gray = pPalette[*src_scan];
-        if (bNonseparableBlend) {
-          blended_color =
-              blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-        }
-        gray = bNonseparableBlend ? blended_color
-                                  : _BLEND(blend_type, *dest_scan, gray);
+        if (bNonseparableBlend)
+          gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+        else
+          gray = _BLEND(blend_type, *dest_scan, gray);
         if (clip_scan && clip_scan[col] < 255) {
           *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
         } else {
@@ -1931,7 +1913,6 @@
   if (src_alpha_scan) {
     if (blend_type) {
       FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-      int blended_color;
       for (int col = 0; col < pixel_count; col++) {
         uint8_t gray = pPalette[*src_scan];
         src_scan++;
@@ -1961,12 +1942,10 @@
         *dest_alpha_scan =
             back_alpha + src_alpha - back_alpha * src_alpha / 255;
         int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
-        if (bNonseparableBlend) {
-          blended_color =
-              blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-        }
-        gray = bNonseparableBlend ? blended_color
-                                  : _BLEND(blend_type, *dest_scan, gray);
+        if (bNonseparableBlend)
+          gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+        else
+          gray = _BLEND(blend_type, *dest_scan, gray);
         *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
         dest_alpha_scan++;
         dest_scan++;
@@ -2008,7 +1987,6 @@
   } else {
     if (blend_type) {
       FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-      int blended_color;
       for (int col = 0; col < pixel_count; col++) {
         uint8_t gray = pPalette[*src_scan];
         src_scan++;
@@ -2028,12 +2006,10 @@
             back_alpha + src_alpha - back_alpha * src_alpha / 255;
         *dest_alpha_scan++ = dest_alpha;
         int alpha_ratio = src_alpha * 255 / dest_alpha;
-        if (bNonseparableBlend) {
-          blended_color =
-              blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-        }
-        gray = bNonseparableBlend ? blended_color
-                                  : _BLEND(blend_type, *dest_scan, gray);
+        if (bNonseparableBlend)
+          gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+        else
+          gray = _BLEND(blend_type, *dest_scan, gray);
         *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
         dest_scan++;
       }
@@ -2074,18 +2050,15 @@
   int set_gray = pPalette[1];
   if (blend_type) {
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-    int blended_color;
     for (int col = 0; col < pixel_count; col++) {
       uint8_t gray =
           (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
               ? set_gray
               : reset_gray;
-      if (bNonseparableBlend) {
-        blended_color =
-            blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-      }
-      gray = bNonseparableBlend ? blended_color
-                                : _BLEND(blend_type, *dest_scan, gray);
+      if (bNonseparableBlend)
+        gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+      else
+        gray = _BLEND(blend_type, *dest_scan, gray);
       if (clip_scan && clip_scan[col] < 255) {
         *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
       } else {
@@ -2120,7 +2093,6 @@
   int set_gray = pPalette[1];
   if (blend_type) {
     FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
-    int blended_color;
     for (int col = 0; col < pixel_count; col++) {
       uint8_t gray =
           (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
@@ -2142,12 +2114,10 @@
           back_alpha + src_alpha - back_alpha * src_alpha / 255;
       *dest_alpha_scan++ = dest_alpha;
       int alpha_ratio = src_alpha * 255 / dest_alpha;
-      if (bNonseparableBlend) {
-        blended_color =
-            blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
-      }
-      gray = bNonseparableBlend ? blended_color
-                                : _BLEND(blend_type, *dest_scan, gray);
+      if (bNonseparableBlend)
+        gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+      else
+        gray = _BLEND(blend_type, *dest_scan, gray);
       *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
       dest_scan++;
     }
diff --git a/core/fxge/dib/fx_dib_main.cpp b/core/fxge/dib/fx_dib_main.cpp
index 8ce2056..a7f7dc7 100644
--- a/core/fxge/dib/fx_dib_main.cpp
+++ b/core/fxge/dib/fx_dib_main.cpp
@@ -1234,14 +1234,31 @@
     }
   }
 }
+
+// TODO(weili): Split this function into two for handling CMYK and RGB
+// colors separately.
 FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor,
                                         FX_DWORD backcolor) {
   ASSERT(!IsAlphaMask());
   if (!m_pBuffer || IsAlphaMask()) {
     return FALSE;
   }
-  int fc, fm, fy, fk, bc, bm, by, bk;
-  int fr, fg, fb, br, bg, bb;
+  // Values used for CMYK colors.
+  int fc = 0;
+  int fm = 0;
+  int fy = 0;
+  int fk = 0;
+  int bc = 0;
+  int bm = 0;
+  int by = 0;
+  int bk = 0;
+  // Values used for RGB colors.
+  int fr = 0;
+  int fg = 0;
+  int fb = 0;
+  int br = 0;
+  int bg = 0;
+  int bb = 0;
   FX_BOOL isCmykImage = IsCmykImage();
   if (isCmykImage) {
     fc = FXSYS_GetCValue(forecolor);
diff --git a/core/fxge/ge/fx_ge_font.cpp b/core/fxge/ge/fx_ge_font.cpp
index 67b968b..098195d 100644
--- a/core/fxge/ge/fx_ge_font.cpp
+++ b/core/fxge/ge/fx_ge_font.cpp
@@ -522,7 +522,7 @@
       return Unicode;
     }
   }
-  return -1;
+  return static_cast<FX_DWORD>(-1);
 }
 
 CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(CFX_Font* pFont,
diff --git a/core/fxge/ge/fx_ge_path.cpp b/core/fxge/ge/fx_ge_path.cpp
index 0b52cdf..de84de2 100644
--- a/core/fxge/ge/fx_ge_path.cpp
+++ b/core/fxge/ge/fx_ge_path.cpp
@@ -340,7 +340,9 @@
                      -100000 * 1.0f);
   int iPoint = 0;
   FX_FLOAT half_width = line_width;
-  int iStartPoint, iEndPoint, iMiddlePoint;
+  int iStartPoint = 0;
+  int iEndPoint = 0;
+  int iMiddlePoint = 0;
   FX_BOOL bJoin;
   while (iPoint < m_PointCount) {
     if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
diff --git a/core/fxge/ge/fx_ge_text.cpp b/core/fxge/ge/fx_ge_text.cpp
index 3f001d2..bcc630c 100644
--- a/core/fxge/ge/fx_ge_text.cpp
+++ b/core/fxge/ge/fx_ge_text.cpp
@@ -375,7 +375,10 @@
   uint8_t* dest_buf = bitmap.GetBuffer();
   int dest_pitch = bitmap.GetPitch();
   int Bpp = bitmap.GetBPP() / 8;
-  int a, r, g, b;
+  int a = 0;
+  int r = 0;
+  int g = 0;
+  int b = 0;
   if (anti_alias == FXFT_RENDER_MODE_LCD) {
     _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
     ArgbDecode(fill_color, a, r, g, b);
diff --git a/core/fxge/win32/fx_win32_gdipext.cpp b/core/fxge/win32/fx_win32_gdipext.cpp
index ce181bb..2fdfa3a 100644
--- a/core/fxge/win32/fx_win32_gdipext.cpp
+++ b/core/fxge/win32/fx_win32_gdipext.cpp
@@ -982,7 +982,7 @@
   }
   GpPen* pPen = NULL;
   CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
-  LineCap lineCap;
+  LineCap lineCap = LineCapFlat;
   DashCap dashCap = DashCapFlat;
   FX_BOOL bDashExtend = FALSE;
   switch (pGraphState->m_LineCap) {
@@ -1000,7 +1000,7 @@
       break;
   }
   CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
-  LineJoin lineJoin;
+  LineJoin lineJoin = LineJoinMiterClipped;
   switch (pGraphState->m_LineJoin) {
     case CFX_GraphStateData::LineJoinMiter:
       lineJoin = LineJoinMiterClipped;
diff --git a/fpdfsdk/formfiller/cba_fontmap.cpp b/fpdfsdk/formfiller/cba_fontmap.cpp
index 519c7d8..caa0704 100644
--- a/fpdfsdk/formfiller/cba_fontmap.cpp
+++ b/fpdfsdk/formfiller/cba_fontmap.cpp
@@ -206,8 +206,8 @@
   }
 
   CFX_ByteString sDA;
-  CPDF_Object* pObj;
-  if ((pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA")))
+  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA");
+  if (pObj)
     sDA = pObj->GetString();
 
   if (bWidget) {
diff --git a/fpdfsdk/fpdfppo.cpp b/fpdfsdk/fpdfppo.cpp
index 4377c3e..6a72141 100644
--- a/fpdfsdk/fpdfppo.cpp
+++ b/fpdfsdk/fpdfppo.cpp
@@ -86,8 +86,7 @@
   CPDF_Array* pKeysArray = pNewPages->GetArrayBy("Kids");
   if (!pKeysArray) {
     CPDF_Array* pNewKids = new CPDF_Array;
-    FX_DWORD Kidsobjnum = -1;
-    Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);
+    FX_DWORD Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);
 
     pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));
     pNewPages->SetAt("Count", new CPDF_Number(0));
diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp
index cbb8e00..24b592a 100644
--- a/fpdfsdk/fpdftext.cpp
+++ b/fpdfsdk/fpdftext.cpp
@@ -51,7 +51,7 @@
 DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page,
                                                    int index) {
   if (!text_page)
-    return -1;
+    return 0;
   IPDF_TextPage* textpage = (IPDF_TextPage*)text_page;
 
   if (index < 0 || index >= textpage->CountChars())
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 1c9024d..589a6de 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -282,7 +282,7 @@
 #endif  // _WIN32
 
 void ProcessParseError(CPDF_Parser::Error err) {
-  FX_DWORD err_code;
+  FX_DWORD err_code = FPDF_ERR_SUCCESS;
   // Translate FPDFAPI error code to FPDFVIEW error code
   switch (err) {
     case CPDF_Parser::SUCCESS:
diff --git a/fpdfsdk/fxedit/fxet_ap.cpp b/fpdfsdk/fxedit/fxet_ap.cpp
index 6f064b2..5bf6136 100644
--- a/fpdfsdk/fxedit/fxet_ap.cpp
+++ b/fpdfsdk/fxedit/fxet_ap.cpp
@@ -18,12 +18,10 @@
     if (SubWord > 0) {
       Word = SubWord;
     } else {
-      FX_DWORD dwCharCode = -1;
-
-      if (pPDFFont->IsUnicodeCompatible())
-        dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
-      else
-        dwCharCode = pFontMap->CharCodeFromUnicode(nFontIndex, Word);
+      FX_DWORD dwCharCode =
+          pPDFFont->IsUnicodeCompatible()
+              ? pPDFFont->CharCodeFromUnicode(Word)
+              : pFontMap->CharCodeFromUnicode(nFontIndex, Word);
 
       if (dwCharCode > 0) {
         pPDFFont->AppendChar(sWord, dwCharCode);
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 144d428..36ea910 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -1459,7 +1459,7 @@
   FX_BOOL bIsLatin = FALSE;
 
   for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
-    FX_DWORD charcode = -1;
+    FX_DWORD charcode = static_cast<FX_DWORD>(-1);
     FX_FLOAT kerning;
 
     pTextObj->GetCharInfo(i, charcode, kerning);
@@ -1492,7 +1492,7 @@
   FX_BOOL bIsLatin = FALSE;
 
   for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
-    FX_DWORD charcode = -1;
+    FX_DWORD charcode = static_cast<FX_DWORD>(-1);
     FX_FLOAT kerning;
 
     pTextObj->GetCharInfo(i, charcode, kerning);
diff --git a/pdfium.gyp b/pdfium.gyp
index af4a48f..df2018d 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -96,7 +96,7 @@
     'msvs_disabled_warnings': [
       4005, 4018, 4146, 4333, 4345, 4267,
       # TODO(thestig): Fix all instances, remove this, pdfium:29
-      4245, 4310, 4389, 4701, 4702, 4706,
+      4702,
     ],
     'variables': {
       'clang_warning_flags': [
