Почему в с++ не могут избавиться от переполнения буфера?
Не разбираюсь особо в Си(или с++), но не как не могу понять, почему Си(и,или с++) остается самым популярным в мире языком, без которого ни один большой проект обойтись не может, и при этом самым уязвимым, почему не могут избавиться от strcpy, у этой функции даже свое страница на Википедии есть, и ее подобных, просто удалить из исходников , в новой версии, к примеру С++12(или Си компилятор Х).
Ведь половина эксплоитов именно на переполнение, но ведь от всех них можно избавится простой проверкой длинны, или я что-то не знаю.
Даниил , люди обучаются правописанию в рамках общего образования уже очень давно, буквально с древних времен. Почему люди не могут избавиться от неграмотности и косноязычия? По правописанию есть целые книги даже своя страница в Википедии. Просто взять и удалить неграмотность еще с детства в новых поколениях людей.
Ведь половина всех проблем взаимопонимания и передачи информации начинается именно с неграмотности.
Я очень надеюсь, моя аналогия будет тебе понятна именно в ее верном толковании.
В основе твоего вопроса лежит простая безграмотность. Из языка незачем удалять функции, надо просто грамотно уметь ими пользоваться. Но человек от природы ленив, глуп и безграмотен, что очень хорошо видно даже по твоему изложению вопроса. Если ты банально не пожелал соблюдать даже орфографию в своем вопросе, то зачем кому-то там правильно пользоваться функцией strcpy?
Евгений Шатунов, да с этим у меня большие проблемы, как и с орфографией. И чисто для меня знания всех правил русского яз., всех приложений к ним и да же исключений, ни как ни спасает от ошибок в тексте, странно большинство моих знакомых наоборот не знают правил, но пишут грамотно.
А почему многие языки не содержат аналогичной функции
Даниил, не важно где. Как Си, так и Си++ несут на себе десятки лет разработки софта. Если окажется, что в стандартной библиотеке вдруг удалят эту функцию, то что произойдет с тем софтом, что её использовал? Вот и ответ.
Откуда берутся 100 эксплоитов, и по 1000$ каждый новый продается, при том что для всех компилируемых языков это 100% переполнение буфера, а все современные языки полностью в своих исходниках лишены этой проблемы. Почему нельзя сделать все такие функции, а я не знаток С++, но во всех примерах и реально боевых уязвимостей обязательно есть strcpy. Я не понимаю что сложного обьявить этот метод устаревшим, переписать компилятор, к примеру сделать его приватным.
doublench21, дак старый софт и на старых компиляторах как работал так и будет работать, а новому софту зачем это. Вопрос один. JAVA, JavaScript и многие другие лишены переполнения, хоть и со своими eval . Чисто экономически от нее проблем больше, как мне кажется чем больше, опять же все хаки и получения удаленного Шелла через нее да и только.
Даниил, никто не хочет искать старый компилятор. Все хотят использовать новый. А что, скажем, если я юзаю старую библиотеку и использую новые фишки языка. Старый компиль мне не подходит, он не компилит мой новый код. И от старой либы я тоже отказываться не хочу. Как быть? Вот что бы такого не было и нужна обратная совместимость. Деприкатед та она уже давно объявлена, но удалять её никто не имеет права. Всё упадёт.
Зачем избавляться от strcpy? Она проста и эффективна, как и большая часть языка C. Проверка длинны строки на каждый символ или просто дополнительная проверка -- это проверка и, как следствие, затраченное время. При определённой культуре программирования, покрытия кода тестами (в том числе и со случайными данными), ревью, и использовании средств статического и динамического анализа, риски можно минимизировать. Взамен вы получаете быстрый и легкий код, практически без оверхеда. Из-за отсутствия оверхеда (тяжёлого рантайма), этот язык популярен для всяких системных вещей (я всё ещё скептически настроен насчёт Rust) + очень много кода на нём уже написано и его надо поддерживать + интерфейсы многих библиотек написаны на C из-за возможных проблем с ABI, в случае C++, например и т.п.
В C++ дела обстоят по-другому, и мешать (а тем более путать) его с C не стоит (ну только, если надо что-то системное дёрнуть в недрах вашего кода или написать обвязки для C библиотеки).
Вопрос не про скорость, а безопасность, изучаю metasploit и очень большая часть экспоитов как раз на переполнения буфера, и как раз для всего что написано на С++, чего лишен к примеру Java.
Даниил, Хорошо, если совсем кратко, то -- человеческий фактор, и не более того. Языки программирования -- это всего лишь инструменты. На С ошибку легче допустить, чем, скажем на Java (эти языки, к слову, некорректно сравнивать, они для разного и разные), но эту вероятность можно минимизировать, я написал выше как. Зачем пользоваться более опасным инструментом, я вам выше ответил.
В Java намного сложнее получить похожую проблему, но это не означает, что нельзя (я не Java программист, потому не могу сказать как).
Сама по себе strcpy - нормальная, просто ею не умеют правильно пользоваться. И она ничего не делает для предотвращения не правильного использования. Зато она быстрее своих более безопасных аналогов.
Улучшенная strncpy сокращает варианты не правильного использования.
Но если тебе важна скорость выполнения, и ты уверен, что хорошо понимаешь как работает функция и предпринял все необходимое, чтоб функция не сработала не правильно, то почему бы и не пользоваться strcpy?
Почему в с++ не могут избавиться от переполнения буфера?
Могут и избавились, для тривиальных штук есть контейнеры, строки и всё такое, там всё работает с помощью магии.
но не как не могу понять, почему Си(и,или с++) остается самым популярным в мире языком, без которого ни один большой проект обойтись не может, и при этом самым уязвимым
уязвимы программы, а не язык, просто в других языках делают абстракции, защищающие от подобного, но зачастую они дают оверхед
почему не могут избавиться от strcpy, у этой функции даже свое страница на Википедии есть, и ее подобных, просто удалить из исходников
Так можно не использовать. А вообще из C++ очень и очень неохотно выпиливают устаревший функционал для обратной совместимости.