Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 12
0
		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;
		}
Ejemplo n.º 13
0
        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);
                        });
                    }
                }
            }
        }