Checking if unsigned int less then zero.
Hello! Playing with cpython source, I found some strange strings in socketmodule.c: --- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString( PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return 0; } --- --- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString(PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return NULL; } --- The flowinfo variable declared few strings above as unsgined int. Is there any practical sense in this check? Seems like gcc just removes this check. I think any compiler will generate code that checks as unsigned, for example in x86 its JAE/JGE. May be this code is for "bad" compilers or exotic arch? -- Dmitriy
Dmitriy Tochansky wrote:
Playing with cpython source, I found some strange strings in socketmodule.c:
--- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString( PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return 0; } ---
--- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString(PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return NULL; } ---
The flowinfo variable declared few strings above as unsgined int. Is there any practical sense in this check? Seems like gcc just removes this check. I think any compiler will generate code that checks as unsigned, for example in x86 its JAE/JGE. May be this code is for "bad" compilers or exotic arch?
I think you are right, the < 0 check is redundant. The developers probably forgot to remove it when http://bugs.python.org/issue9975 was fixed.
Playing with cpython source, I found some strange strings in socketmodule.c:
--- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString( PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return 0; } ---
--- if (flowinfo < 0 || flowinfo > 0xfffff) { PyErr_SetString(PyExc_OverflowError, "getsockaddrarg: flowinfo must be 0-1048575."); return NULL; } ---
The flowinfo variable declared few strings above as unsgined int. Is there any practical sense in this check? Seems like gcc just removes this check. I think any compiler will generate code that checks as unsigned, for example in x86 its JAE/JGE. May be this code is for "bad" compilers or exotic arch?
Removed. Thanks, cf
participants (3)
-
Charles-François Natali
-
Dmitriy Tochansky
-
Peter Otten