3 ms·
One thing that is not-so-subtly broken is re-entrancy (e.g. in functions like `strtok()`; fixed later with `strtok_s()` in C11: https://en.cppreference.com/w/c
by einpoklum 6y ago
One thing that is not-so-subtly broken is re-entrancy (e.g. in functions like `strtok()`; fixed later with `strtok_s()` in C11:
https://en.cppreference.com/w/c/string/byte/strtok https://en.cppreference.com/w/c/string/byte/strtok
About getenv: This sort-of fixed with `getenv_s()` in C11
https://en.cppreference.com/w/c/program/getenv https://en.cppreference.com/w/c/program/getenv
- loeg 6y agoRe: getenv_s: Annex K is (still) optional. Compliant C11+ implementations may not have getenv_s.
- josephcsible 6y agoThis is an understatement. The only relevant platform that supports Annex K is MSVC, and this is unlikely to change any time soon.
- loeg 6y agoAnd even MSVC does not actually implement the API specified in Annex K. Annex K was inspired by MSVC's design, but they diverged: > Microsoft Visual Studio implements an early version of the APIs. However, the implementation is incomplete and conforms neither to C11 nor to the original TR 24731-1. For example, it doesn't provide the set_constraint_handler_s function but instead defines a _invalid_parameter_handler _set_invalid_parameter_handler(_invalid_parameter_handler) function with similar behavior but a slightly different and incompatible signature. It also doesn't define the abort_handler_s and ignore_handler_s functions, the memset_s function (which isn't part of the TR), or the RSIZE_MAX macro.The Microsoft implementation also doesn't treat overlapping source and destination sequences as runtime-constraint violations and instead has undefined behavior in such cases. [0]: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm
- kevin_thibedeau 6y agostrtok_r() is everywhere and easy to retrofit. It's also easy to implement using strspn() and strcspn() if you don't have it.
- icedchai 6y agoThis makes sense when you consider the history of C. Multi-threading was a relatively late add on, and outside of the standard library. When I learned C (early 90's), multi-threading wasn't even something you considered. It was either multiple processes or an event loop with select/poll.