В конце прошлого года американское агентство национальной безопасности опубликовало бюллетень, посвященный работе программного обеспечения с памятью, где рекомендовало организациям «рассмотреть возможность стратегического отказа от языков программирования наподобие Си/C++, которые практически не предусматривают встроенных средств защиты памяти, и перехода на альтернативы с безопасным доступом к памяти». В качестве безопасных перечислены языки C#, Go, Java, Ruby, Rust и Swift.
Создатель языка C++ Бьерн Страуструп опубликовал ответ, в котором подчеркнул, что безопасность C++ укреплялась на протяжении десятков лет. В частности, он напомнил, что рекомендации C++ Core Guidelines были созданы специально, чтобы в компиляторах было проще реализовать правила распознавания неудачных приемов программирования, благодаря чему на C++ можно легко писать безопасный код, не прибегая к помощи дополнительных инструментов.
Страуструп также подверг критике тот факт, что в АНБ объединили C++ в одну категорию с более старым Си, тем самым «проигнорировав более чем 30-летний прогресс C++». По словам создателя C++, слишком часты случаи, когда упоминают «мифический язык Си/С++», а затем начинают говорить о недостатках Си. По его словам, многих из слабых мест Си в C++ можно избежать, создавая эффективный код, который более непосредственно выражает намерения программиста.
Кроме того, Страуструп предлагает собственное определение безопасности языка программирования. По его словам, важны прежде всего типобезопасность и безопасность работы с ресурсами, когда каждый объект используется согласно его типу, и утечки ресурсов исключены. А что касается языков, перечисленных АНБ в качестве безопасных, все из них, по словам создателя C++, являются уязвимыми при отсутствии статической верификации кода.
Он напомнил, что в мире — миллионы программистов на C++, создавших миллиарды строк кода. При этом язык используется в аэрокосмической и биомедицинской отраслях, в решении задач физики высоких энергий, при разработке ПО для медицинских приборов, систем искусственного интеллекта и не только, добавил Страуструп.
В АНБ признали, что управление памятью не является полностью безопасным даже в языках программирования, считающихся безопасными, и что в остальных языках для повышения надежности можно применять методы статического и динамического тестирования безопасности приложений (SAST, DAST). Однако эти методы все же не сделают код полностью безопасным, говорится в бюллетене.