Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-111178: Make slot functions in typeobject.c have compatible types #112752

Merged
merged 10 commits into from
Dec 20, 2023

Conversation

chrstphrchvz
Copy link
Contributor

There are likely many more changes to be made for gh-111178; this is just one small batch proposed separately for review by the respective codeowner.

Potential compiler warnings addressed:

Objects/typeobject.c:5352:5: warning: cast from 'void (*)(PyTypeObject *)' (aka 'void (*)(struct _typeobject *)') to 'destructor' (aka 'void (*)(struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5352 |     (destructor)type_dealloc,                   /* tp_dealloc */
      |     ^~~~~~~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5357:5: warning: cast from 'PyObject *(*)(PyTypeObject *)' (aka 'struct _object *(*)(struct _typeobject *)') to 'reprfunc' (aka 'struct _object *(*)(struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5357 |     (reprfunc)type_repr,                        /* tp_repr */
      |     ^~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5362:5: warning: cast from 'PyObject *(*)(PyTypeObject *, PyObject *, PyObject *)' (aka 'struct _object *(*)(struct _typeobject *, struct _object *, struct _object *)') to 'ternaryfunc' (aka 'struct _object *(*)(struct _object *, struct _object *, struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5362 |     (ternaryfunc)type_call,                     /* tp_call */
      |     ^~~~~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5364:5: warning: cast from 'PyObject *(*)(PyTypeObject *, PyObject *)' (aka 'struct _object *(*)(struct _typeobject *, struct _object *)') to 'getattrofunc' (aka 'struct _object *(*)(struct _object *, struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5364 |     (getattrofunc)_Py_type_getattro,            /* tp_getattro */
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5365:5: warning: cast from 'int (*)(PyTypeObject *, PyObject *, PyObject *)' (aka 'int (*)(struct _typeobject *, struct _object *, struct _object *)') to 'setattrofunc' (aka 'int (*)(struct _object *, struct _object *, struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5365 |     (setattrofunc)type_setattro,                /* tp_setattro */
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5372:5: warning: cast from 'int (*)(PyTypeObject *, visitproc, void *)' (aka 'int (*)(struct _typeobject *, int (*)(struct _object *, void *), void *)') to 'traverseproc' (aka 'int (*)(struct _object *, int (*)(struct _object *, void *), void *)') converts to incompatible function type [-Wcast-function-type-strict]
 5372 |     (traverseproc)type_traverse,                /* tp_traverse */
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5373:5: warning: cast from 'int (*)(PyTypeObject *)' (aka 'int (*)(struct _typeobject *)') to 'inquiry' (aka 'int (*)(struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5373 |     (inquiry)type_clear,                        /* tp_clear */
      |     ^~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:5390:5: warning: cast from 'int (*)(PyTypeObject *)' (aka 'int (*)(struct _typeobject *)') to 'inquiry' (aka 'int (*)(struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 5390 |     (inquiry)type_is_gc,                        /* tp_is_gc */
      |     ^~~~~~~~~~~~~~~~~~~
Objects/typeobject.c:6572:5: warning: cast from 'Py_hash_t (*)(const void *)' (aka 'long (*)(const void *)') to 'hashfunc' (aka 'long (*)(struct _object *)') converts to incompatible function type [-Wcast-function-type-strict]
 6572 |     (hashfunc)_Py_HashPointer,                  /* tp_hash */
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~

Example UBSan -fsanitize=function errors addressed:

Objects/typeobject.c:7788:12: runtime error: call to function _Py_type_getattro through pointer to incorrect function type 'struct _object *(*)(struct _object *, struct _object *)'
typeobject.c:4921: note: _Py_type_getattro defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Objects/typeobject.c:7788:12 in 
Objects/call.c:242:18: runtime error: call to function type_call through pointer to incorrect function type 'struct _object *(*)(struct _object *, struct _object *, struct _object *)'
typeobject.c:1634: note: type_call defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Objects/call.c:242:18 in 
Objects/typeobject.c:1905:16: runtime error: call to function type_clear through pointer to incorrect function type 'int (*)(struct _object *)'
typeobject.c:5290: note: type_clear defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Objects/typeobject.c:1905:16 in 
Include/internal/pycore_object.h:444:43: runtime error: call to function type_is_gc through pointer to incorrect function type 'int (*)(struct _object *)'
typeobject.c:5338: note: type_is_gc defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Include/internal/pycore_object.h:444:43 in 
Objects/typeobject.c:5581:12: runtime error: call to function type_repr through pointer to incorrect function type 'struct _object *(*)(struct _object *)'
typeobject.c:1601: note: type_repr defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Objects/typeobject.c:5581:12 in 
Objects/object.c:1308:15: runtime error: call to function type_setattro through pointer to incorrect function type 'int (*)(struct _object *, struct _object *, struct _object *)'
typeobject.c:4927: note: type_setattro defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Objects/object.c:1308:15 in 
Modules/_ctypes/_ctypes.c:908:12: runtime error: call to function type_traverse through pointer to incorrect function type 'int (*)(struct _object *, int (*)(struct _object *, void *), void *)'
typeobject.c:5261: note: type_traverse defined here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Modules/_ctypes/_ctypes.c:908:12 in

Copy link
Member

@encukou encukou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!
A good first step to cut down on this kind of undefined behaviour.

@encukou encukou merged commit a545a86 into python:main Dec 20, 2023
30 checks passed
@chrstphrchvz chrstphrchvz deleted the patch-111178-typeobject branch December 20, 2023 21:44
ryan-duve pushed a commit to ryan-duve/cpython that referenced this pull request Dec 26, 2023
kulikjak pushed a commit to kulikjak/cpython that referenced this pull request Jan 22, 2024
aisk pushed a commit to aisk/cpython that referenced this pull request Feb 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants