private static void addEntry(ConfiguredFiles configuredFiles, List <SourceFile> sourceFileList, Project project) { foreach (SourceFile newSourceFile in sourceFileList) { if (newSourceFile == null) { continue; } bool foundFlag = false; for (int index = 0; index < configuredFiles.Files.Count; index++) { if (newSourceFile.FileName.CompareTo(configuredFiles.Files[index].FileName) == 0 && newSourceFile.FilePath.CompareTo(configuredFiles.Files[index].FilePath) == 0) { // file already exists in list foundFlag = true; break; } } if (!foundFlag) { configuredFiles.Files.Add(newSourceFile); string projectName = project.Name; _outputPane.OutputString("Will check: " + projectName + " | " + newSourceFile.FilePath + "/" + newSourceFile.FileName); } } }
private void checkProjects(Object[] activeProjects) { Debug.Assert(activeProjects.Any()); List <ConfiguredFiles> allConfiguredFiles = new List <ConfiguredFiles>(); foreach (dynamic o in activeProjects) { Configuration configuration = getConfiguration(o); if (configuration == null) { MessageBox.Show("Cannot perform check - no valid configuration selected", "Cppcheck error"); return; } dynamic projectFiles = getProjectFiles(o, configuration); if (projectFiles == null) { continue; } ConfiguredFiles configuredFiles = new ConfiguredFiles(); configuredFiles.Files = projectFiles; configuredFiles.Configuration = configuration; allConfiguredFiles.Add(configuredFiles); } MainToolWindow.Instance.ContentsType = ICodeAnalyzer.AnalysisType.ProjectAnalysis; MainToolWindow.Instance.showIfWindowNotCreated(); runAnalysis(allConfiguredFiles, _outputPane, false); }
private static void addEntry(ConfiguredFiles configuredFiles, SourceFile sourceFile, Project project) { if (sourceFile != null) { List <SourceFile> sourceFileList = new List <SourceFile>(); sourceFileList.Add(sourceFile); addEntry(configuredFiles, sourceFileList, project); } }
private void runSavedFileAnalysis(SourceFile file, Configuration currentConfig, OutputWindowPane outputPane) { Debug.Assert(currentConfig != null); var configuredFiles = new ConfiguredFiles(); configuredFiles.Files = new List <SourceFile> { file }; configuredFiles.Configuration = currentConfig; runAnalysis(new List <ConfiguredFiles> { configuredFiles }, outputPane, true); }
private void runSavedFileAnalysis(SourceFile file, Configuration currentConfig) { Debug.Assert(currentConfig != null); var configuredFiles = new ConfiguredFiles(); configuredFiles.Files = new List <SourceFile> { file }; configuredFiles.Configuration = currentConfig; System.Threading.Thread.Sleep(750); runAnalysis(new List <ConfiguredFiles> { configuredFiles }, true); }
private async Task checkProjectsAsync(Object[] activeProjects) { Debug.Assert(activeProjects.Any()); List <ConfiguredFiles> allConfiguredFiles = new List <ConfiguredFiles>(); foreach (dynamic o in activeProjects) { Configuration configuration = await getConfigurationAsync(o); if (configuration == null) { MessageBox.Show("Cannot perform check - no valid configuration selected", "Cppcheck error"); return; } dynamic projectFiles = await getProjectFilesAsync(o, configuration); if (projectFiles == null) { continue; } ConfiguredFiles configuredFiles = new ConfiguredFiles(); configuredFiles.Files = projectFiles; configuredFiles.Configuration = configuration; allConfiguredFiles.Add(configuredFiles); } await JoinableTaskFactory.SwitchToMainThreadAsync(); MainToolWindow.Instance.ContentsType = ICodeAnalyzer.AnalysisType.ProjectAnalysis; MainToolWindow.Instance.showIfWindowNotCreated(); runAnalysis(allConfiguredFiles, false); }
private void runSavedFileAnalysis(SourceFile file, Configuration currentConfig, OutputWindowPane outputPane) { Debug.Assert(currentConfig != null); var configuredFiles = new ConfiguredFiles(); configuredFiles.Files = new List<SourceFile> {file}; configuredFiles.Configuration = currentConfig; runAnalysis(new List<ConfiguredFiles> {configuredFiles}, outputPane, true); }
private void checkProjects(Object[] activeProjects) { Debug.Assert(activeProjects.Any()); List<ConfiguredFiles> allConfiguredFiles = new List<ConfiguredFiles>(); foreach (dynamic o in activeProjects) { Configuration configuration = getConfiguration(o); if (configuration == null) { MessageBox.Show("Cannot perform check - no valid configuration selected", "Cppcheck error"); return; } dynamic projectFiles = getProjectFiles(o, configuration); if (projectFiles == null) continue; ConfiguredFiles configuredFiles = new ConfiguredFiles(); configuredFiles.Files = projectFiles; configuredFiles.Configuration = configuration; allConfiguredFiles.Add(configuredFiles); } MainToolWindow.Instance.ContentsType = ICodeAnalyzer.AnalysisType.ProjectAnalysis; MainToolWindow.Instance.showIfWindowNotCreated(); runAnalysis(allConfiguredFiles, _outputPane, false); }
private string getCPPCheckArgs(ConfiguredFiles configuredFiles, bool analysisOnSavedFile, bool multipleProjects, string tempFileName) { Debug.Assert(_numCores > 0); String cppheckargs = Properties.Settings.Default.DefaultArguments; if (Properties.Settings.Default.SeveritiesString.Length != 0) { cppheckargs += " --enable=" + Properties.Settings.Default.SeveritiesString; } HashSet <string> suppressions = new HashSet <string>(Properties.Settings.Default.SuppressionsString.Split(',')); suppressions.Add("unmatchedSuppression"); HashSet <string> skippedFilesMask = new HashSet <string>(); HashSet <string> skippedIncludeMask = new HashSet <string>(); SuppressionsInfo unitedSuppressionsInfo = readSuppressions(ICodeAnalyzer.SuppressionStorage.Global); unitedSuppressionsInfo.UnionWith(readSuppressions(ICodeAnalyzer.SuppressionStorage.Solution)); var filesToAnalyze = configuredFiles.Files; // Creating the list of all different project locations (no duplicates) HashSet <string> projectPaths = new HashSet <string>(); // enforce uniqueness on the list of project paths foreach (var file in filesToAnalyze) { projectPaths.Add(file.BaseProjectPath); } Debug.Assert(projectPaths.Count == 1); _projectBasePath = projectPaths.First(); _projectName = filesToAnalyze[0].ProjectName; // Creating the list of all different suppressions (no duplicates) foreach (var path in projectPaths) { unitedSuppressionsInfo.UnionWith(readSuppressions(SuppressionStorage.Project, path, filesToAnalyze[0].ProjectName)); } if (!multipleProjects) { cppheckargs += (" --relative-paths=\"" + filesToAnalyze[0].BaseProjectPath + "\""); } cppheckargs += (" -j " + _numCores.ToString()); if (Properties.Settings.Default.InconclusiveChecksEnabled) { cppheckargs += " --inconclusive "; } suppressions.UnionWith(unitedSuppressionsInfo.SuppressionLines); foreach (string suppression in suppressions) { if (!String.IsNullOrWhiteSpace(suppression)) { cppheckargs += (" --suppress=" + suppression); } } if (!(analysisOnSavedFile && Properties.Settings.Default.IgnoreIncludePaths)) { // We only add include paths once, and then specify a set of files to check HashSet <string> includePaths = new HashSet <string>(); foreach (var file in filesToAnalyze) { if (!matchMasksList(file.FilePath, unitedSuppressionsInfo.SkippedFilesMask)) { includePaths.UnionWith(file.IncludePaths); } } includePaths.Add(filesToAnalyze[0].BaseProjectPath); // Fix for #60 foreach (string path in includePaths) { if (!matchMasksList(path, unitedSuppressionsInfo.SkippedIncludesMask)) { String includeArgument = " -I\"" + path + "\""; cppheckargs = cppheckargs + " " + includeArgument; } } } using (StreamWriter tempFile = new StreamWriter(tempFileName)) { foreach (SourceFile file in filesToAnalyze) { if (!matchMasksList(file.FileName, unitedSuppressionsInfo.SkippedFilesMask)) { tempFile.WriteLine(file.FilePath); } } } cppheckargs += " --file-list=\"" + tempFileName + "\""; if ((analysisOnSavedFile && Properties.Settings.Default.FileOnlyCheckCurrentConfig) || (!analysisOnSavedFile && Properties.Settings.Default.ProjectOnlyCheckCurrentConfig)) // Only checking current macros configuration (for speed) { cppheckargs = cppheckargs.Replace("--force", ""); // Creating the list of all different macros (no duplicates) HashSet <string> macros = new HashSet <string>(); macros.Add("__cplusplus=199711L"); // At least in VS2012, this is still 199711L // Assuming all files passed here are from the same project / same toolset, which should be true, so peeking the first file for global settings switch (filesToAnalyze[0].vcCompilerVersion) { case SourceFile.VCCompilerVersion.vc2003: macros.Add("_MSC_VER=1310"); break; case SourceFile.VCCompilerVersion.vc2005: macros.Add("_MSC_VER=1400"); break; case SourceFile.VCCompilerVersion.vc2008: macros.Add("_MSC_VER=1500"); break; case SourceFile.VCCompilerVersion.vc2010: macros.Add("_MSC_VER=1600"); break; case SourceFile.VCCompilerVersion.vc2012: macros.Add("_MSC_VER=1700"); break; case SourceFile.VCCompilerVersion.vc2013: macros.Add("_MSC_VER=1800"); break; case SourceFile.VCCompilerVersion.vcFuture: macros.Add("_MSC_VER=1900"); break; } foreach (var file in filesToAnalyze) { macros.UnionWith(file.Macros); } macros.Add("WIN32"); macros.Add("_WIN32"); if (configuredFiles.is64bitConfiguration()) { macros.Add("_M_X64"); macros.Add("_WIN64"); } else { macros.Add("_M_IX86"); } if (configuredFiles.isDebugConfiguration()) { macros.Add("_DEBUG"); } foreach (string macro in macros) { if (!String.IsNullOrEmpty(macro) && !macro.Contains(" ") /* macros with spaces are invalid in VS */) { String macroArgument = " -D" + macro; cppheckargs += macroArgument; } } HashSet <string> macrosToUndefine = new HashSet <string>(); foreach (var file in filesToAnalyze) { macrosToUndefine.UnionWith(file.MacrosToUndefine); } foreach (string macro in macrosToUndefine) { if (!String.IsNullOrEmpty(macro) && !macro.Contains(" ") /* macros with spaces are invalid in VS */) { String macroUndefArgument = " -U" + macro; cppheckargs += macroUndefArgument; } } } else if (!cppheckargs.Contains("--force")) { cppheckargs += " --force"; } return(cppheckargs); }
private List <ConfiguredFiles> getActiveSelections() { Dictionary <Project, ConfiguredFiles> confMap = new Dictionary <Project, ConfiguredFiles>(); foreach (SelectedItem selItem in _dte.SelectedItems) { Project project = null; if (project == null && selItem.ProjectItem != null) { project = selItem.ProjectItem.ContainingProject; } if (project == null) { project = selItem.Project; } if (project == null || !isVisualCppProject(project.Object)) { continue; } Configuration configuration = getConfiguration(project); if (!confMap.ContainsKey(project)) { // create new Map key entry for project ConfiguredFiles configuredFiles = new ConfiguredFiles(); confMap.Add(project, configuredFiles); configuredFiles.Files = new List <SourceFile>(); configuredFiles.Configuration = configuration; } ConfiguredFiles currentConfiguredFiles = confMap[project]; if (currentConfiguredFiles == null) { continue; } if (selItem.ProjectItem == null) { // project selected List <SourceFile> projectSourceFileList = getProjectFiles(project, configuration); foreach (SourceFile projectSourceFile in projectSourceFileList) { addEntry(currentConfiguredFiles, projectSourceFileList, project); } } else { dynamic projectItem = selItem.ProjectItem.Object; if (isFilter(projectItem)) { List <SourceFile> sourceFileList = new List <SourceFile>(); scanFilter(projectItem, sourceFileList, currentConfiguredFiles, configuration, project); addEntry(currentConfiguredFiles, sourceFileList, project); } else if (isCppFile(projectItem)) { dynamic file = selItem.ProjectItem.Object; // non project selected if (file != null) { // document selected SourceFile sourceFile = createSourceFile(file.FullPath, configuration, project.Object); addEntry(currentConfiguredFiles, sourceFile, project); } } } } List <ConfiguredFiles> configuredFilesList = new List <ConfiguredFiles>(); foreach (ConfiguredFiles configuredFiles in confMap.Values) { if (configuredFiles.Files.Any()) { configuredFilesList.Add(configuredFiles); } } return(configuredFilesList); }
private static void scanFilter(dynamic filter, List <SourceFile> sourceFileList, ConfiguredFiles configuredFiles, Configuration configuration, Project project) { foreach (dynamic item in filter.Items) { if (isFilter(item)) { scanFilter(item, sourceFileList, configuredFiles, configuration, project); } else if (isCppFile(item)) { dynamic file = item.ProjectItem.Object; // non project selected if (file != null) { // document selected SourceFile sourceFile = createSourceFile(file.FullPath, configuration, project.Object); addEntry(configuredFiles, sourceFile, project); } } } }
private string getCPPCheckArgs(ConfiguredFiles configuredFiles, bool analysisOnSavedFile, bool multipleProjects, string tempFileName) { Debug.Assert(_numCores > 0); String cppheckargs = Properties.Settings.Default.DefaultArguments; if (Properties.Settings.Default.SeveritiesString.Length != 0) cppheckargs += " --enable=" + Properties.Settings.Default.SeveritiesString; HashSet<string> suppressions = new HashSet<string>(Properties.Settings.Default.SuppressionsString.Split(',')); suppressions.Add("unmatchedSuppression"); HashSet<string> skippedFilesMask = new HashSet<string>(); HashSet<string> skippedIncludeMask = new HashSet<string>(); SuppressionsInfo unitedSuppressionsInfo = readSuppressions(ICodeAnalyzer.SuppressionStorage.Global); unitedSuppressionsInfo.UnionWith(readSuppressions(ICodeAnalyzer.SuppressionStorage.Solution)); var filesToAnalyze = configuredFiles.Files; // Creating the list of all different project locations (no duplicates) HashSet<string> projectPaths = new HashSet<string>(); // enforce uniqueness on the list of project paths foreach (var file in filesToAnalyze) { projectPaths.Add(file.BaseProjectPath); } Debug.Assert(projectPaths.Count == 1); _projectBasePath = projectPaths.First(); _projectName = filesToAnalyze[0].ProjectName; // Creating the list of all different suppressions (no duplicates) foreach (var path in projectPaths) { unitedSuppressionsInfo.UnionWith(readSuppressions(SuppressionStorage.Project, path, filesToAnalyze[0].ProjectName)); } if (!multipleProjects) cppheckargs += (" --relative-paths=\"" + filesToAnalyze[0].BaseProjectPath + "\""); cppheckargs += (" -j " + _numCores.ToString()); if (Properties.Settings.Default.InconclusiveChecksEnabled) cppheckargs += " --inconclusive "; suppressions.UnionWith(unitedSuppressionsInfo.SuppressionLines); foreach (string suppression in suppressions) { if (!String.IsNullOrWhiteSpace(suppression)) cppheckargs += (" --suppress=" + suppression); } // We only add include paths once, and then specify a set of files to check HashSet<string> includePaths = new HashSet<string>(); foreach (var file in filesToAnalyze) { if (!matchMasksList(file.FilePath, unitedSuppressionsInfo.SkippedFilesMask)) includePaths.UnionWith(file.IncludePaths); } includePaths.Add(filesToAnalyze[0].BaseProjectPath); // Fix for #60 foreach (string path in includePaths) { if (!matchMasksList(path, unitedSuppressionsInfo.SkippedIncludesMask)) { String includeArgument = " -I\"" + path + "\""; cppheckargs = cppheckargs + " " + includeArgument; } } using (StreamWriter tempFile = new StreamWriter(tempFileName)) { foreach (SourceFile file in filesToAnalyze) { if (!matchMasksList(file.FileName, unitedSuppressionsInfo.SkippedFilesMask)) tempFile.WriteLine(file.FilePath); } } cppheckargs += " --file-list=\"" + tempFileName + "\""; if ((analysisOnSavedFile && Properties.Settings.Default.FileOnlyCheckCurrentConfig) || (!analysisOnSavedFile && Properties.Settings.Default.ProjectOnlyCheckCurrentConfig)) // Only checking current macros configuration (for speed) { cppheckargs = cppheckargs.Replace("--force", ""); // Creating the list of all different macros (no duplicates) HashSet<string> macros = new HashSet<string>(); macros.Add("__cplusplus=199711L"); // At least in VS2012, this is still 199711L // Assuming all files passed here are from the same project / same toolset, which should be true, so peeking the first file for global settings switch (filesToAnalyze[0].vcCompilerVersion) { case SourceFile.VCCompilerVersion.vc2003: macros.Add("_MSC_VER=1310"); break; case SourceFile.VCCompilerVersion.vc2005: macros.Add("_MSC_VER=1400"); break; case SourceFile.VCCompilerVersion.vc2008: macros.Add("_MSC_VER=1500"); break; case SourceFile.VCCompilerVersion.vc2010: macros.Add("_MSC_VER=1600"); break; case SourceFile.VCCompilerVersion.vc2012: macros.Add("_MSC_VER=1700"); break; case SourceFile.VCCompilerVersion.vc2013: macros.Add("_MSC_VER=1800"); break; case SourceFile.VCCompilerVersion.vcFuture: macros.Add("_MSC_VER=1900"); break; } foreach (var file in filesToAnalyze) { macros.UnionWith(file.Macros); } macros.Add("WIN32"); macros.Add("_WIN32"); if (configuredFiles.is64bitConfiguration()) { macros.Add("_M_X64"); macros.Add("_WIN64"); } else { macros.Add("_M_IX86"); } if (configuredFiles.isDebugConfiguration()) macros.Add("_DEBUG"); foreach (string macro in macros) { if (!String.IsNullOrEmpty(macro) && !macro.Contains(" ") /* macros with spaces are invalid in VS */) { String macroArgument = " -D" + macro; cppheckargs += macroArgument; } } HashSet<string> macrosToUndefine = new HashSet<string>(); foreach (var file in filesToAnalyze) { macrosToUndefine.UnionWith(file.MacrosToUndefine); } foreach (string macro in macrosToUndefine) { if (!String.IsNullOrEmpty(macro) && !macro.Contains(" ") /* macros with spaces are invalid in VS */) { String macroUndefArgument = " -U" + macro; cppheckargs += macroUndefArgument; } } } else if (!cppheckargs.Contains("--force")) cppheckargs += " --force"; return cppheckargs; }
private static void scanFilter(dynamic filter, List <SourceFile> sourceFileList, ConfiguredFiles configuredFiles, Configuration configuration, Project project) { foreach (dynamic item in filter.Items) { if (isFilter(item)) { scanFilter(item, sourceFileList, configuredFiles, configuration, project); } else if (isCppFile(item)) { dynamic file = item.ProjectItem.Object; // non project selected if (file != null) { // document selected _instance.JoinableTaskFactory.Run(async() => { await _instance.JoinableTaskFactory.SwitchToMainThreadAsync(); SourceFile sourceFile = await createSourceFileAsync(file.FullPath, configuration, project.Object); addEntry(configuredFiles, sourceFile, project); }); } } } }