Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cdt-dev] Static Analysis Framework for CDT

Hi Alena,

On Thu, Apr 16, 2009 at 10:44 PM, Elena Laskavaia <elaskavaia@xxxxxxx> wrote:
This is something I am doing in my spare time - I want to create
static analysis framework for CDT, light weigh set of classes that allow
to have common interface for dealing with problems produced by static analysis tools
(and some default checkers, such what JDT has, i.e Potential Null Pointer Dereference, etc).

See design details at: http://wiki.eclipse.org/CDT/designs/StaticAnalysis

I think that that kind of analysis will be very beneficial to have in CDT. It would be handy to have also quick fixes for those like in the sample patch attached.

It would be nice to have options to do the analysis in background as indexer does or/and be able to analyze a file or all files in a folder.

Andrew


_______________________________________________
cdt-dev mailing list
cdt-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-dev

### Eclipse Workspace Patch 1.0
#P org.eclipse.cdt.codan.checkers
Index: plugin.xml
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt/codan/org.eclipse.cdt.codan.checkers/plugin.xml,v
retrieving revision 1.1
diff -u -r1.1 plugin.xml
--- plugin.xml	9 Apr 2009 12:48:43 -0000	1.1
+++ plugin.xml	17 Apr 2009 16:01:47 -0000
@@ -15,5 +15,12 @@
       </problem>
       </checker>
    </extension>
+   <extension
+         point="org.eclipse.ui.ide.markerResolution">
+      <markerResolutionGenerator
+            class="org.eclipse.cdt.codan.checkers.sample.MarkerResolutionGenerator"
+            markerType="org.eclipse.cdt.codan.core.codanProblem">
+      </markerResolutionGenerator>
+   </extension>
 
 </plugin>
Index: META-INF/MANIFEST.MF
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF,v
retrieving revision 1.1
diff -u -r1.1 MANIFEST.MF
--- META-INF/MANIFEST.MF	9 Apr 2009 12:48:44 -0000	1.1
+++ META-INF/MANIFEST.MF	17 Apr 2009 16:01:47 -0000
@@ -8,6 +8,9 @@
  org.eclipse.core.runtime,
  org.eclipse.core.resources;bundle-version="3.5.0",
  org.eclipse.cdt.core;bundle-version="5.1.0",
- org.eclipse.cdt.codan.core;bundle-version="1.0.0"
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.ui.editors;bundle-version="3.5.0",
+ org.eclipse.cdt.codan.core;bundle-version="1.0.0",
+ org.eclipse.jface.text;bundle-version="3.5.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Index: src/org/eclipse/cdt/codan/checkers/sample/QuickFixAssignmentInCondition.java
===================================================================
RCS file: src/org/eclipse/cdt/codan/checkers/sample/QuickFixAssignmentInCondition.java
diff -N src/org/eclipse/cdt/codan/checkers/sample/QuickFixAssignmentInCondition.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/codan/checkers/sample/QuickFixAssignmentInCondition.java	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,80 @@
+package org.eclipse.cdt.codan.checkers.sample;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.FindReplaceDocumentAdapter;
+import org.eclipse.jface.text.IDocument;
+
+public class QuickFixAssignmentInCondition implements IMarkerResolution {
+
+	@Override
+	public String getLabel() {
+		return "Change first occurence '=' in the line to condition '=='";
+	}
+
+	@Override
+	public void run(IMarker marker) {
+		// See if there is an open editor on the file containing the marker
+		IWorkbenchWindow w = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if (w == null) {
+			return;
+		}
+
+		IWorkbenchPage page = w.getActivePage();
+		if (page == null) {
+			return;
+		}
+
+		IFileEditorInput input = new FileEditorInput((IFile) marker.getResource());
+		IEditorPart editorPart = page.findEditor(input);
+
+		if (editorPart == null) {
+			// open an editor
+			try {
+				editorPart = IDE.openEditor(page, (IFile) marker.getResource(), true);
+			} catch (PartInitException e) {
+				e.printStackTrace();
+			}
+		}
+		if (editorPart == null) {
+			return;
+		}
+
+		if (editorPart instanceof ITextEditor) {
+			ITextEditor editor = (ITextEditor) editorPart;
+			IDocument doc = editor.getDocumentProvider().getDocument(
+					editor.getEditorInput());
+			
+			int line = marker.getAttribute(IMarker.LINE_NUMBER, -1)-1;
+
+			FindReplaceDocumentAdapter dad = new FindReplaceDocumentAdapter(doc);
+			try {
+				dad.find(doc.getLineOffset(line), "=", /*forwardSearch*/ true, /*caseSensitive*/ false,
+						/*wholeWord*/ false, /*regExSearch*/ false);
+				dad.replace("==", /*regExReplace*/ false);
+				marker.delete();
+			} catch (BadLocationException e) {
+				// TODO: log the error
+				e.printStackTrace();
+			} catch (CoreException e) {
+				// TODO: log the error
+				e.printStackTrace();
+			}
+			
+		}
+	}
+
+}
Index: src/org/eclipse/cdt/codan/checkers/sample/MarkerResolutionGenerator.java
===================================================================
RCS file: src/org/eclipse/cdt/codan/checkers/sample/MarkerResolutionGenerator.java
diff -N src/org/eclipse/cdt/codan/checkers/sample/MarkerResolutionGenerator.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/codan/checkers/sample/MarkerResolutionGenerator.java	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,14 @@
+package org.eclipse.cdt.codan.checkers.sample;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IMarkerResolutionGenerator;
+
+public class MarkerResolutionGenerator implements IMarkerResolutionGenerator {
+
+	@Override
+	public IMarkerResolution[] getResolutions(IMarker marker) {
+		return new IMarkerResolution[] { new QuickFixAssignmentInCondition() };
+	}
+
+}

Back to the top