На сайте PVS-Studio давеча была опубликована очередная статья серии про Undefined Behaviour в C++. Там и две первые были отличные, ну а третья, на мой взгляд просто шикарная. Если вы программируете на C++ и еще не читали, то настоятельно рекомендую.
Пара главных впечатлений от прочтения.
Во-первых, я сам уже давно нахожусь в раздумьях о том, а хорошо ли то, что в C++ так много неявных преобразований типов. С одной стороны, наверное, есть в этом и положительные стороны. Типа такого:
void do_something(std::string_view what) {...}
...
do_something("simple-string-literal");
Ведь, если вдуматься, подобных неявных преобразований много. Просто за счет того, что они неявные, мы не отдаем себе отчета о том, насколько же они сокращают объем кода.
Но, с другой стороны, эти неявные преобразования могут вести к таким непредсказуемым последствиям, что мама не горюй.
И чем больше с такими последствиями сталкиваешься, тем меньше хочется иметь этих самых неявных преобразований. Поэтому чем дальше, тем больше я становлюсь сторонником того, чтобы эти самые неявные преобразования из C++ потихонечку устраняли бы. Даже не глядя на потерю совместимости с уже написанным кодом в новых стандартах.
А данная статья со своими примерами кладет несколько лишних камешков на чашу именно этой точки зрения.
Во-вторых, количество приводимых примеров UB наводит на мысль о том, что нормальный человек просто не в состоянии оценивать все те грабли, которые можно собрать программируя на C++.
Отчасти это не так страшно, т.к. при нормальном тестировании и использовании санитайзеров и анализаторов изрядную их часть можно собрать еще на этапе разработки.
Тут скорее в другую сторону имеет смысл глянуть: любые собеседования по C++, на которых собеседуемого просят посмотреть на код и рассказать, что получится в итоге, превращаются в откровенный цирк. Не, ну реально, в безобидном с виду коде могут оказаться такие грабли, о которых можно вообще никогда не догадаться. Просто потому, что мало кто знает C++ от и до, и способен удержать все эти тонкие моменты в своей голове.
Так что даже не знаю как поведу себя, если когда-нибудь придется проходить собеседование на C++ разработчика и меня попросят рассказать что сделает тот или иной код. Вроде как самым естественным было бы спросить "Ребят, а вы в своем уме вообще?" Но, боюсь, окажусь не понятым 🤣