Сообщение Про безопасный C++ от 21.09.2024 4:39
Изменено 21.09.2024 6:24 Shmj
Про безопасный C++
На мысль навела статья.
Вот в C++ принято что нет проверки выхода за пределы массива. Т.е. обратились по индексу 6, в то время как элементов всего 6 — вам даже не сообщат об ошибке. Считается что C++-разработчики не могут допустить таких ошибок и если ты допустил — то вон из профессии, таким как ты тут не место (ну или хотя бы никому не говори об этом).
Добавлю оговорку. Есть at(), который как бы на отвяжись добавили. Однако же он не решает проблему, т.к. даже при банальном копировании данных он вызываться не будет (см. пример ниже).
Это можно оправдать скоростью работы, ведь каждая проверка требует доп. инструкций процессора. Было бы неплохо иметь возможность хотя бы применять такие проверки по некой опции, к примеру добавить флаг сборки или что-то подобное. Когда уже отладил — флаг можно и убрать, в принципе.
Более того — скорость не всегда критична и не всегда на первом месте — иногда важнее точность работы кода и быстрое обнаружение ошибок.
И вопрос такой. В принципе то C++ не виноват, он же не запрещает проверки выхода за пределы. Однако же виновата философия, которая говорит что такие проверки нужны только школьникам, что настоящие программисты не ошибаются. И я подумал грешным делом — а что если просто добавить обертки для стандартных классов, которые выполняют такие проверки? Не слишком ли смелое решение?
Как оказалось, дело это не такое уж тривиальное. Вот, к примеру, GPT выдал для проверки c std::ranges — но это не всегда работает как нужно:
Ну и сам вопрос. Может кто-то уже думал в этом направлении и есть такие безопасные обертки?
Вот в C++ принято что нет проверки выхода за пределы массива. Т.е. обратились по индексу 6, в то время как элементов всего 6 — вам даже не сообщат об ошибке. Считается что C++-разработчики не могут допустить таких ошибок и если ты допустил — то вон из профессии, таким как ты тут не место (ну или хотя бы никому не говори об этом).
Добавлю оговорку. Есть at(), который как бы на отвяжись добавили. Однако же он не решает проблему, т.к. даже при банальном копировании данных он вызываться не будет (см. пример ниже).
Это можно оправдать скоростью работы, ведь каждая проверка требует доп. инструкций процессора. Было бы неплохо иметь возможность хотя бы применять такие проверки по некой опции, к примеру добавить флаг сборки или что-то подобное. Когда уже отладил — флаг можно и убрать, в принципе.
Более того — скорость не всегда критична и не всегда на первом месте — иногда важнее точность работы кода и быстрое обнаружение ошибок.
И вопрос такой. В принципе то C++ не виноват, он же не запрещает проверки выхода за пределы. Однако же виновата философия, которая говорит что такие проверки нужны только школьникам, что настоящие программисты не ошибаются. И я подумал грешным делом — а что если просто добавить обертки для стандартных классов, которые выполняют такие проверки? Не слишком ли смелое решение?
Как оказалось, дело это не такое уж тривиальное. Вот, к примеру, GPT выдал для проверки c std::ranges — но это не всегда работает как нужно:
Скрытый текст | |
| |
Ну и сам вопрос. Может кто-то уже думал в этом направлении и есть такие безопасные обертки?
Про безопасный C++
На мысль навела статья.
Вот в C++ принято что нет проверки выхода за пределы массива. Т.е. обратились по индексу 6, в то время как элементов всего 6 — вам даже не сообщат об ошибке. Считается что C++-разработчики не могут допустить таких ошибок и если ты допустил — то вон из профессии, таким как ты тут не место (ну или хотя бы никому не говори об этом).
Добавлю оговорку. Есть at(), который как бы на отвяжись добавили. Однако же он не решает проблему, т.к. даже при банальном копировании данных он вызываться не будет (см. пример ниже).
Это можно оправдать скоростью работы, ведь каждая проверка требует доп. инструкций процессора. Было бы неплохо иметь возможность хотя бы применять такие проверки по некой опции, к примеру добавить флаг сборки или что-то подобное. Когда уже отладил — флаг можно и убрать, в принципе. Более того — скорость не всегда критична и не всегда на первом месте — иногда важнее точность работы кода и быстрое обнаружение ошибок.
И вопрос такой. В принципе то C++ не виноват, он же не запрещает проверки выхода за пределы. Однако же виновата философия, которая говорит что такие проверки нужны только школьникам, что настоящие программисты не ошибаются. И я подумал грешным делом — а что если просто добавить обертки для стандартных классов, которые выполняют такие проверки? Не слишком ли смелое решение?
Как оказалось, дело это не такое уж тривиальное. Вот, к примеру, GPT выдал для проверки c std::ranges — но это не всегда работает как нужно:
Ну и сам вопрос. Может кто-то уже думал в этом направлении и есть такие безопасные обертки?
Вот в C++ принято что нет проверки выхода за пределы массива. Т.е. обратились по индексу 6, в то время как элементов всего 6 — вам даже не сообщат об ошибке. Считается что C++-разработчики не могут допустить таких ошибок и если ты допустил — то вон из профессии, таким как ты тут не место (ну или хотя бы никому не говори об этом).
Добавлю оговорку. Есть at(), который как бы на отвяжись добавили. Однако же он не решает проблему, т.к. даже при банальном копировании данных он вызываться не будет (см. пример ниже).
Это можно оправдать скоростью работы, ведь каждая проверка требует доп. инструкций процессора. Было бы неплохо иметь возможность хотя бы применять такие проверки по некой опции, к примеру добавить флаг сборки или что-то подобное. Когда уже отладил — флаг можно и убрать, в принципе. Более того — скорость не всегда критична и не всегда на первом месте — иногда важнее точность работы кода и быстрое обнаружение ошибок.
И вопрос такой. В принципе то C++ не виноват, он же не запрещает проверки выхода за пределы. Однако же виновата философия, которая говорит что такие проверки нужны только школьникам, что настоящие программисты не ошибаются. И я подумал грешным делом — а что если просто добавить обертки для стандартных классов, которые выполняют такие проверки? Не слишком ли смелое решение?
Как оказалось, дело это не такое уж тривиальное. Вот, к примеру, GPT выдал для проверки c std::ranges — но это не всегда работает как нужно:
Скрытый текст | |
| |
Ну и сам вопрос. Может кто-то уже думал в этом направлении и есть такие безопасные обертки?