From: Anatol Belski Date: Mon, 29 Aug 2016 15:29:28 +0000 (+0200) Subject: support also cppcheck for static analyze X-Git-Tag: php-7.1.0RC1~35 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ab2a58753f2a7fdc1fd899e5ab54f75bdbe0c88;p=php support also cppcheck for static analyze --- diff --git a/win32/build/config.w32 b/win32/build/config.w32 index bc3e94ddf5..ca3d1bdd24 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -233,6 +233,23 @@ if (PHP_ANALYZER == "vs") { } else { DEFINE("CLANG_CL", clang_cl); } +} else if (PHP_ANALYZER == "cppcheck") { + + var cppcheck = false; + + if (FSO.FileExists(PROGRAM_FILES + "\\Cppcheck\\cppcheck.exe")) { + cppcheck = PROGRAM_FILES + "\\Cppcheck\\cppcheck.exe"; + } else if (FSO.FileExists(PROGRAM_FILESx86 + "\\Cppcheck\\cppcheck.exe")) { + cppcheck = PROGRAM_FILESx86 + "\\Cppcheck\\cppcheck.exe"; + } + if (!cppcheck) { + if (false == PATH_PROG('cppcheck', null, 'CPPCHECK')) { + WARNING("Couldn't find Cppcheck binaries, static analyze was disabled"); + PHP_ANALYZER = "no"; + } + } else { + DEFINE("CPPCHECK", cppcheck); + } } else if (PHP_ANALYZER == "pvs") { var pvs_studio = false; diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 383c36e02f..c1f245593b 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -1528,6 +1528,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir) if (PHP_ANALYZER == "clang") { var analyzer_base_args = X64 ? "-m64" : "-m32"; + var analyzer_base_flags = ""; analyzer_base_args += " --analyze"; @@ -1539,6 +1540,37 @@ function ADD_SOURCES(dir, file_list, target, obj_dir) } analyzer_base_args += " -fms-compatibility -fms-compatibility-version=" + vc_ver + " -fms-extensions"; + } else if (PHP_ANALYZER == "cppcheck") { + var analyzer_base_args = ""; + var analyzer_base_flags = ""; + + if (VS_TOOLSET) { + analyzer_base_flags += " -D _MSC_VER=" + VCVERS; + } else { + analyzer_base_flags += " -D _MSC_VER=" + probe_binary(PATH_PROG('cl', null)); + } + + if (X64) { + analyzer_base_flags += " -D _M_X64 -D _WIN32 -D _WIN64"; + } else { + analyzer_base_flags += " -D _M_IX86 -D _WIN32"; + } + + var vc_incs = WshShell.Environment("Process").Item("INCLUDE").split(";") + for (i in vc_incs) { + analyzer_base_flags += " -I " + "\"" + vc_incs[i] + "\""; + } + + var cppcheck_platform = X64 ? "win64" : "win32A"; + var cppcheck_lib = "win32\\build\\cppcheck_" + (X64 ? "x64" : "x86") + ".cfg"; + analyzer_base_args += "--enable=warning,performance,portability,information,missingInclude " + + "--platform=" + cppcheck_platform + " " + + "--library=windows.cfg --library=microsoft_sal.cfg " + + "--library=win32\\build\\cppcheck.cfg " + + "--library=" + cppcheck_lib + " " + + /* "--rule-file=win32\build\cppcheck_rules.xml " + */ + " --std=c89 --std=c++11 " + + "--quiet --inconclusive --template=vs "; } if (PHP_MP_DISABLED) { @@ -1552,7 +1584,9 @@ function ADD_SOURCES(dir, file_list, target, obj_dir) MFO.WriteLine("\t@$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " /Fo" + sub_build + d + obj); if ("clang" == PHP_ANALYZER) { - MFO.WriteLine("\t\"@$(CLANG_CL)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) /c " + dir + "\\" + src); + MFO.WriteLine("\t\"@$(CLANG_CL)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + dir + "\\" + src); + } else if ("cppcheck" == PHP_ANALYZER) { + MFO.WriteLine("\t\"@$(CPPCHECK)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + analyzer_base_flags + " " + dir + "\\" + src); }else if (PHP_ANALYZER == "pvs") { MFO.WriteLine("\t@\"$(PVS_STUDIO)\" --cl-params $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " --source-file " + dir + "\\" + src + " --cfg PVS-Studio.conf --errors-off \"V122 V117 V111\" "); @@ -1568,7 +1602,9 @@ function ADD_SOURCES(dir, file_list, target, obj_dir) MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + d + " $(" + bd_flags_name + ") /c " + src_line); if ("clang" == PHP_ANALYZER) { - MFO.WriteLine("\t\"$(CLANG_CL)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) /c " + src_line); + MFO.WriteLine("\t\"$(CLANG_CL)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + src_line); + } else if ("cppcheck" == PHP_ANALYZER) { + MFO.WriteLine("\t\"$(CPPCHECK)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + analyzer_base_flags + " " + src_line); } } } @@ -1753,6 +1789,8 @@ function write_summary() ar[5] = ['Static analyzer', 'Visual Studio']; } else if (PHP_ANALYZER == "clang") { ar[5] = ['Static analyzer', 'clang']; + } else if (PHP_ANALYZER == "cppcheck") { + ar[5] = ['Static analyzer', 'Cppcheck']; } else if (PHP_ANALYZER == "pvs") { ar[5] = ['Static analyzer', 'PVS-Studio']; } else { @@ -2081,6 +2119,59 @@ function generate_phpize() CJ.Close(); } +function extract_convert_style_line(val, match_sw, to_sw, keep_mkfile_vars) +{ + var ret = ""; + + /*var re = new RegExp(match_sw + "(.*)", "g"); + var r; + + while (r = re.execute(val)) { + WARNING(r); + } + return ret;*/ + + var cf = val.replace(/\s+/g, " ").split(" "); + + var i_val = false; + for (var i in cf) { + var r; + + if (keep_mkfile_vars) { + r = cf[i].match(/^\$\((.*)\)/); + if (!!r) { + ret += " " + r[0]; + continue; + } + } + + if (i_val && !!cf[i]) { + i_val = false; + ret += " " + to_sw + " " + cf[i]; + continue; + } + + var re; + + re = new RegExp(match_sw + "(.*)"); + r = cf[i].match(re); + if (!!r && r.length > 1 && !!r[1]) { + /* The value is not ws separated from the switch. */ + ret += " " + to_sw + " " + r[1]; + continue; + } + + r = cf[i].match(match_sw); + if (!!r) { + //WARNING(cf[i]); + /* Value is going to be added in the next iteration. */ + i_val = true; + } + } + + return ret; +} + function handle_analyzer_makefile_flags(fd, key, val) { var relevant = false; @@ -2094,6 +2185,7 @@ function handle_analyzer_makefile_flags(fd, key, val) if (key.match("CFLAGS")) { var new_val = val; var reg = /\$\(([^\)]+)\)/g; + var r; while (r = reg.exec(val)) { var repl = "$(" + r[1] + "_ANALYZER)" new_val = new_val.replace(r[0], repl); @@ -2111,10 +2203,26 @@ function handle_analyzer_makefile_flags(fd, key, val) .replace(/\/MP \d+ /, "") .replace(/\/MP /, "") .replace("/LD ", ""); + } else if ("cppcheck" == PHP_ANALYZER) { + new_val = ""; + + new_val += extract_convert_style_line(val, "/I", "-I", true); + new_val += extract_convert_style_line(val, "/D", "-D", false); + + val = new_val; } - + relevant = true; } else if (key.match("BASE_INCLUDES")) { + if ("cppcheck" == PHP_ANALYZER) { + new_val = ""; + + new_val += extract_convert_style_line(val, "/I", "-I", true); + new_val += extract_convert_style_line(val, "/D", "-D", false); + + val = new_val; + } + relevant = true; } diff --git a/win32/build/cppcheck.cfg b/win32/build/cppcheck.cfg new file mode 100644 index 0000000000..a59d20ec68 --- /dev/null +++ b/win32/build/cppcheck.cfg @@ -0,0 +1,356 @@ + + + + + false + + + + false + + + + false + + + + + + + false + + + + + + + + + + + + + false + + + + + + + + + + false + + + + + + false + + + + + + false + + + + false + + + + + + + + + + false + + + + false + + + + false + + + + false + + + + false + + + false + + + + + false + + + + + + + false + + + + + + + + false + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _emalloc + _safe_emalloc + _ecalloc + _estrdup + _estrndup + _efree + + + _emalloc_large + _efree_large + + + _emalloc_huge + _efree_huge + + + __zend_malloc + __zend_calloc + _safe_malloc + zend_strndup + free + + + _zend_mm_malloc + _zend_mm_calloc + _zend_mm_free + + + + true + + + + true + + + + true + + + + true + + + + true + + + + + false + + + + + + + + + + false + + + + + + + + false + + + + + + false + + + + + + + + + + + + + false + + + + zend_str_alloc + zend_str_free + + diff --git a/win32/build/cppcheck_x64.cfg b/win32/build/cppcheck_x64.cfg new file mode 100644 index 0000000000..4c221a6fcd --- /dev/null +++ b/win32/build/cppcheck_x64.cfg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/win32/build/cppcheck_x86.cfg b/win32/build/cppcheck_x86.cfg new file mode 100644 index 0000000000..a7934704fc --- /dev/null +++ b/win32/build/cppcheck_x86.cfg @@ -0,0 +1,17 @@ + + + + + + + + + + + + +