четверг, 15 августа 2024 г.

[prog.c++] Отличная статья про UB в C++

На сайте 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++ разработчика и меня попросят рассказать что сделает тот или иной код. Вроде как самым естественным было бы спросить "Ребят, а вы в своем уме вообще?" Но, боюсь, окажусь не понятым 🤣