diff options
author | David Malcolm <dmalcolm@redhat.com> | 2009-11-13 17:36:12 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2009-11-13 17:36:12 -0500 |
commit | 5f27e15adc7a7edf7adc20e081b59ab468610627 (patch) | |
tree | d5c3cd7c777d858ee76d53e19e917560653ab79a | |
parent | cdfd25bd47710289cb119f1fc5088870f3418134 (diff) | |
download | check-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.cocci | 76 | ||||
-rw-r--r-- | validate.py | 44 |
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) + |