Sebastian Ernst <[email protected]> added the comment:
Thanks a lot for the clarification, Eryk. I did not notice that it was
deprecated behavior.
For the "too many arguments" case I guess this is not an issue. However, just
for the symmetry of things, I also looked at calling a function with TOO FEW
arguments.
```C
int16_t __stdcall __declspec(dllimport) mul_ints(
int16_t a,
int16_t b
)
{
return a * b;
}
```
```python
def test_error_callargs_unconfigured_too_few_args():
dll = ctypes.windll.LoadLibrary('tests/demo_dll.dll')
mul_ints = dll.mul_ints
with pytest.raises(ValueError):
a = mul_ints(7)
```
As expected after your explanation, also no error in CPython 3.8 (i.e. the test
fails, while is passes on CPython <= 3.7). If I run this manually, I even get a
"result":
```python
>>> dll = ctypes.windll.LoadLibrary('tests/demo_dll.dll')
>>> mul_ints = dll.mul_ints
>>> a = mul_ints(7)
>>> a
445564 # !
>>> 445564/7 # Just looking at where this result is coming from ...
63652.0
```
Re-starting Python (3.8) and (intentionally) misconfiguring the function
interestingly also does not change the result:
```python
>>> dll = ctypes.windll.LoadLibrary('tests/demo_dll.dll')
>>> mul_ints = dll.mul_ints
>>> mul_ints.argtypes = (ctypes.c_int16,)
>>> a = mul_ints(7)
>>> a
445564 # Apparently, this is deterministic?!?
```
Just out of curiosity, where is this data coming from?
This ONLY way to prevent things like this to happen is to actually correctly
configure the function:
```python
>>> dll = ctypes.windll.LoadLibrary('tests/demo_dll.dll')
>>> mul_ints = dll.mul_ints
>>> mul_ints.argtypes = (ctypes.c_int16, ctypes.c_int16)
>>> mul_ints(7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: this function takes 2 arguments (1 given)
```
This should very CLEARLY be mentioned in the documentation ...
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue38258>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com