[Python-checkins] r51311 - python/trunk/Modules/_ctypes/_ctypes.c
thomas.heller
python-checkins at python.org
Wed Aug 16 15:03:14 CEST 2006
Author: thomas.heller
Date: Wed Aug 16 15:03:11 2006
New Revision: 51311
Modified:
python/trunk/Modules/_ctypes/_ctypes.c
Log:
Add commented assert statements to check that the result of
PyObject_stgdict() and PyType_stgdict() calls are non-NULL before
dereferencing the result. Hopefully this fixes what klocwork is
complaining about.
Fix a few other nits as well.
Modified: python/trunk/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/trunk/Modules/_ctypes/_ctypes.c (original)
+++ python/trunk/Modules/_ctypes/_ctypes.c Wed Aug 16 15:03:11 2006
@@ -152,7 +152,7 @@
parg->tag = 'V';
stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict);
+ assert(stgdict); /* Cannot be NULL for structure/union instances */
parg->pffi_type = &stgdict->ffi_type_pointer;
/* For structure parameters (by value), parg->value doesn't contain the structure
data itself, instead parg->value.p *points* to the structure's data
@@ -328,7 +328,6 @@
/* If we got a PyCArgObject, we must check if the object packed in it
is an instance of the type's dict->proto */
-// if(dict && ob && dict->proto == (PyObject *)ob->ob_type){
if(dict && ob
&& PyObject_IsInstance(ob, dict->proto)) {
Py_INCREF(value);
@@ -693,6 +692,7 @@
the item types are the same.
*/
StgDictObject *v = PyObject_stgdict(value);
+ assert(v); /* Cannot be NULL for pointer or array objects */
if (PyObject_IsSubclass(v->proto, typedict->proto)) {
Py_INCREF(value);
return value;
@@ -1154,7 +1154,9 @@
if (ArrayObject_Check(value) || PointerObject_Check(value)) {
/* c_wchar array instance or pointer(c_wchar(...)) */
StgDictObject *dt = PyObject_stgdict(value);
- StgDictObject *dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
+ StgDictObject *dict;
+ assert(dt); /* Cannot be NULL for pointer or array objects */
+ dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
if (dict && (dict->setfunc == getentry("u")->setfunc)) {
Py_INCREF(value);
return value;
@@ -1216,7 +1218,9 @@
if (ArrayObject_Check(value) || PointerObject_Check(value)) {
/* c_char array instance or pointer(c_char(...)) */
StgDictObject *dt = PyObject_stgdict(value);
- StgDictObject *dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
+ StgDictObject *dict;
+ assert(dt); /* Cannot be NULL for pointer or array objects */
+ dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
if (dict && (dict->setfunc == getentry("c")->setfunc)) {
Py_INCREF(value);
return value;
@@ -1468,7 +1472,7 @@
struct fielddesc *fd;
dict = PyObject_stgdict((PyObject *)self);
- assert(dict);
+ assert(dict); /* Cannot be NULL for CDataObject instances */
fmt = PyString_AsString(dict->proto);
assert(fmt);
@@ -2066,6 +2070,7 @@
CData_clear(CDataObject *self)
{
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
+ assert(dict); /* Cannot be NULL for CDataObject instances */
Py_CLEAR(self->b_objects);
if ((self->b_needsfree)
&& ((size_t)dict->size > sizeof(self->b_value)))
@@ -2363,7 +2368,9 @@
StgDictObject *p1, *p2;
PyObject *keep;
p1 = PyObject_stgdict(value);
+ assert(p1); /* Cannot be NULL for array instances */
p2 = PyType_stgdict(type);
+ assert(p2); /* Cannot be NULL for pointer types */
if (p1->proto != p2->proto) {
PyErr_Format(PyExc_TypeError,
@@ -2512,7 +2519,7 @@
return self->restype;
}
dict = PyObject_stgdict((PyObject *)self);
- assert(dict);
+ assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
if (dict->restype) {
Py_INCREF(dict->restype);
return dict->restype;
@@ -2554,7 +2561,7 @@
return self->argtypes;
}
dict = PyObject_stgdict((PyObject *)self);
- assert(dict);
+ assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
if (dict->argtypes) {
Py_INCREF(dict->argtypes);
return dict->argtypes;
@@ -2647,8 +2654,12 @@
_validate_paramflags(PyTypeObject *type, PyObject *paramflags)
{
int i, len;
- StgDictObject *dict = PyType_stgdict((PyObject *)type);
- PyObject *argtypes = dict->argtypes;
+ StgDictObject *dict;
+ PyObject *argtypes;
+
+ dict = PyType_stgdict((PyObject *)type);
+ assert(dict); /* Cannot be NULL. 'type' is a CFuncPtr type. */
+ argtypes = dict->argtypes;
if (paramflags == NULL || dict->argtypes == NULL)
return 1;
@@ -3260,7 +3271,7 @@
int outmask;
unsigned int numretvals;
- assert(dict); /* if not, it's a bug */
+ assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
restype = self->restype ? self->restype : dict->restype;
converters = self->converters ? self->converters : dict->converters;
checker = self->checker ? self->checker : dict->checker;
@@ -3681,7 +3692,7 @@
}
stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict);
+ assert(stgdict); /* Cannot be NULL for array instances */
/* Would it be clearer if we got the item size from
stgdict->proto's stgdict?
*/
@@ -3712,6 +3723,7 @@
len = ihigh - ilow;
stgdict = PyObject_stgdict((PyObject *)self);
+ assert(stgdict); /* Cannot be NULL for array object instances */
proto = stgdict->proto;
itemdict = PyType_stgdict(proto);
if (itemdict->getfunc == getentry("c")->getfunc) {
@@ -3750,6 +3762,7 @@
}
stgdict = PyObject_stgdict((PyObject *)self);
+ assert(stgdict); /* Cannot be NULL for array object instances */
if (index < 0 || index >= stgdict->length) {
PyErr_SetString(PyExc_IndexError,
"invalid index");
@@ -3941,6 +3954,7 @@
PyObject *result;
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
+ assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->setfunc);
result = dict->setfunc(self->b_ptr, value, dict->size);
if (!result)
@@ -3966,8 +3980,8 @@
{
StgDictObject *dict;
dict = PyObject_stgdict((PyObject *)self);
+ assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->getfunc);
- dict = PyObject_stgdict((PyObject *)self);
return dict->getfunc(self->b_ptr, self->b_size);
}
@@ -4140,11 +4154,10 @@
}
stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict);
- assert(stgdict->proto);
+ assert(stgdict); /* Cannot be NULL for pointer object instances */
proto = stgdict->proto;
- /* XXXXXX MAKE SURE PROTO IS NOT NULL! */
+ assert(proto);
itemdict = PyType_stgdict(proto);
size = itemdict->size;
offset = index * itemdict->size;
@@ -4175,11 +4188,11 @@
}
stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict);
- assert(stgdict->proto);
+ assert(stgdict); /* Cannot be NULL fr pointer instances */
proto = stgdict->proto;
- /* XXXXXX MAKE SURE PROTO IS NOT NULL! */
+ assert(proto);
+
itemdict = PyType_stgdict(proto);
size = itemdict->size;
offset = index * itemdict->size;
@@ -4200,7 +4213,7 @@
}
stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict);
+ assert(stgdict); /* Cannot be NULL fr pointer instances */
return CData_FromBaseObj(stgdict->proto,
(PyObject *)self, 0,
*(void **)self->b_ptr);
@@ -4219,7 +4232,7 @@
return -1;
}
stgdict = PyObject_stgdict((PyObject *)self);
- /* should have been catched in Pointer_new() */
+ assert(stgdict); /* Cannot be NULL fr pointer instances */
assert(stgdict->proto);
if (!CDataObject_Check(value)
|| 0 == PyObject_IsInstance(value, stgdict->proto)) {
@@ -4295,8 +4308,11 @@
len = ihigh - ilow;
stgdict = PyObject_stgdict((PyObject *)self);
+ assert(stgdict); /* Cannot be NULL fr pointer instances */
proto = stgdict->proto;
+ assert(proto);
itemdict = PyType_stgdict(proto);
+ assert(itemdict);
if (itemdict->getfunc == getentry("c")->getfunc) {
char *ptr = *(char **)self->b_ptr;
return PyString_FromStringAndSize(ptr + ilow, len);
More information about the Python-checkins
mailing list