private void copyCppcheckRunModule() {
    String dexterHome = DexterConfig.getInstance().getDexterHome();
    if (Strings.isNullOrEmpty(dexterHome)) {
      throw new DexterRuntimeException(
          "Can't initialize Cppcheck plugin, because the dexter_home is not initialized");
    }

    // copy %DEXTER_HOME%/bin/cppcheck
    String zipFilePath = dexterHome;
    String cppcheckPath = "";

    if (DexterUtil.getOS() == DexterUtil.OS.WINDOWS) {
      zipFilePath += "/temp/cppcheck-windows_" + PLUGIN_VERSION + ".zip";
      cppcheckPath = "/cppcheck-windows.zip";
    } else { // LINUX or MAC
      if (DexterUtil.getBit() == DexterUtil.BIT._32) {
        zipFilePath += "/temp/cppcheck-linux_" + PLUGIN_VERSION + "_32.zip";
        cppcheckPath = "/cppcheck-linux-32.zip";
      } else {
        zipFilePath += "/temp/cppcheck-linux_" + PLUGIN_VERSION + "_64.zip";
        cppcheckPath = "/cppcheck-linux-64.zip";
      }
    }

    final File file = new File(zipFilePath);
    if (!file.exists()) {
      final InputStream is = getClass().getResourceAsStream(cppcheckPath);
      if (is == null) {
        throw new DexterRuntimeException("can't find cppcheck.zip file: " + cppcheckPath);
      }

      try {
        FileUtils.copyInputStreamToFile(is, file);
        DexterUtil.unzip(zipFilePath, CPPCHECK_HOME_DIR);
      } catch (Exception e) {
        throw new DexterRuntimeException(e.getMessage(), e);
      } finally {
        try {
          is.close();
        } catch (IOException e) {
          // do nothing
        }
      }
    }
  }