Огромное количество операций на С++ приводит к поведению undefined, где спецификация полностью не соответствует тому, что должно быть поведением программы, и допускает, чтобы что-либо произошло. Из-за этого существуют случаи, когда люди имеют код, который компилируется в режиме отладки, но не в режиме выпуска, или работает до тех пор, пока не будет сделано какое-либо несвязанное изменение, или работает на одном компьютере, но не на другом, и т.д.
Мой вопрос в том, есть ли утилита, которая смотрит на выполнение кода С++ и флаги всех экземпляров, где программа вызывает поведение undefined. Хотя хорошо, что у нас есть инструменты, такие как valgrind и проверенные реализации STL, это не так сильно, как то, о чем я думаю - valgrind может иметь ложные негативы, если вы удаляете память, которую вы все еще выделили, например, и проверили реализации STL не будет удаляться с помощью указателя базового класса.
Имеется ли этот инструмент? Или было бы даже полезно, если бы он вообще лежал?
РЕДАКТИРОВАТЬ. Я знаю, что в общем случае нельзя статически проверять, может ли программа на С++ выполнять что-то, что имеет поведение undefined. Тем не менее, можно определить, выполнялось ли конкретное выполнение С++ поведения undefined. Одним из способов сделать это было бы сделать интерпретатор С++, который будет проходить через код в соответствии с определениями, указанными в спецификации, в каждой точке, определяющей, имеет ли код поведение undefined. Это не будет обнаруживать поведение undefined, которое не происходит при выполнении конкретной программы, но оно найдет поведение undefined, которое действительно проявляется в программе. Это связано с тем, как распознать Тьюринга, чтобы определить, принимает ли ТМ некоторый ввод, даже если он все еще неразрешимый вообще.
Спасибо!