summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2009-11-13 17:36:12 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2009-11-13 17:36:12 -0500
commit5f27e15adc7a7edf7adc20e081b59ab468610627 (patch)
treed5c3cd7c777d858ee76d53e19e917560653ab79a
parentcdfd25bd47710289cb119f1fc5088870f3418134 (diff)
downloadcheck-cpython-5f27e15adc7a7edf7adc20e081b59ab468610627.tar.gz
check-cpython-5f27e15adc7a7edf7adc20e081b59ab468610627.tar.xz
check-cpython-5f27e15adc7a7edf7adc20e081b59ab468610627.zip
Move most python code to a new file (validate.py)
-rw-r--r--pyarg-parsetuple.cocci76
-rw-r--r--validate.py44
2 files changed, 64 insertions, 56 deletions
diff --git a/pyarg-parsetuple.cocci b/pyarg-parsetuple.cocci
index 2bc454b..4beb481 100644
--- a/pyarg-parsetuple.cocci
+++ b/pyarg-parsetuple.cocci
@@ -1,69 +1,33 @@
-@ParseTuple@
+@ParseTuple_1@
+position p1;
expression args;
expression fmt;
type t1;
-t1 p1;
+t1 e1;
@@
-PyArg_ParseTuple(args, fmt, p1)
+PyArg_ParseTuple(args, fmt@p1, e1)
-@script:python@
-args << ParseTuple.args;
-fmt << ParseTuple.fmt;
-t1 << ParseTuple.t1;
+@initialize:python@
+import sys
+sys.path.append('.')
+from validate import *
+@script:python@
+args << ParseTuple_1.args;
+fmt << ParseTuple_1.fmt;
+t1 << ParseTuple_1.t1;
+p1 << ParseTuple_1.p1;
@@
"""
-Analyze
+Analyze format strings, compare to vararg types actually passed
"""
-# FIXME: generalize thisto varargs
-
-
-def get_types(strfmt):
- """
- Generate a list of C type names from a format string
- """
- result = []
- i = 0
- while i < len(strfmt):
- c = strfmt[i]
- if c == 'i':
- result.append('int *')
- if c in [':', ';']:
- break
- i += 1
- return result
-
-class CExtensionError(Exception):
- # Base class for errors discovered by static analysis in C extension code
- pass
-
-class WrongNumberOfVars(CExtensionError):
- pass
-
-class NotEnoughVars(WrongNumberOfVars):
- pass
-
-class TooManyVars(WrongNumberOfVars):
- pass
-
-class MismatchingType(WrongNumberOfVars):
- pass
-
-def validate_types(format_string, actual_types):
- exp_types = get_types(format_string)
- if len(actual_types) < len(exp_types):
- raise NotEnoughVars(actual_types, exp_types)
- if len(actual_types) > len(exp_types):
- raise TooManyVars(actual_types, exp_types)
- for exp, actual in zip(exp_types, actual_types):
- if exp != actual:
- raise MismatchingType(exp, actual)
-
-print "args: %s" % args
-print "fmt: %s" % fmt
-print "var1: %s" % t1
-print get_types(fmt.expr)
+# FIXME: generalize this to varargs
+#print "args: %s" % args
+#print "fmt: %s" % fmt
+#print "var1: %s" % t1
+#print get_types(fmt.expr)
+print p1[0].__dict__ #.line, p1.column
validate_types(fmt.expr, [t1])
diff --git a/validate.py b/validate.py
new file mode 100644
index 0000000..5827ddf
--- /dev/null
+++ b/validate.py
@@ -0,0 +1,44 @@
+"""
+Hooks for validating CPython extension source code
+"""
+def get_types(strfmt):
+ """
+ Generate a list of C type names from a PyArg_ParseTuple format string
+ """
+ result = []
+ i = 0
+ while i < len(strfmt):
+ c = strfmt[i]
+ if c == 'i':
+ result.append('int *')
+ if c in [':', ';']:
+ break
+ i += 1
+ return result
+
+class CExtensionError(Exception):
+ # Base class for errors discovered by static analysis in C extension code
+ pass
+
+class WrongNumberOfVars(CExtensionError):
+ pass
+
+class NotEnoughVars(WrongNumberOfVars):
+ pass
+
+class TooManyVars(WrongNumberOfVars):
+ pass
+
+class MismatchingType(WrongNumberOfVars):
+ pass
+
+def validate_types(format_string, actual_types):
+ exp_types = get_types(format_string)
+ if len(actual_types) < len(exp_types):
+ raise NotEnoughVars(actual_types, exp_types)
+ if len(actual_types) > len(exp_types):
+ raise TooManyVars(actual_types, exp_types)
+ for exp, actual in zip(exp_types, actual_types):
+ if exp != actual:
+ raise MismatchingType(exp, actual)
+