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