Реализация C ++, которая обнаруживает неопределенное поведение?

Огромное количество операций в C ++ приводит к неопределенному поведению, где спецификация полностью отключается о том, что должно быть поведение программы и позволяет для чего-либо произойти. Из-за этого есть все виды случаев, когда люди имеют код, который компилирует в отладке, но не релиз режима, или это работает до тех пор, пока не сделано необразившевленное изменение, или это работает на одном компьютере, но не другой и т. Д.

Вопрос: есть ли утилита, которая смотрит на выполнение кода C ++ и флаги всех экземпляров, в которых программа вызывает неопределенное поведение. Хотя приятно, что у нас есть инструменты, такие как VALGRIND и проверили реализации STL, они не так сильно, как то, о чем я думаю, - VALGRIND может иметь ложные негативы, если вы мусорную память, которую вы все еще выделили, например, и проверенные реализации STL не поймает удаление через указатель базового класса.

существует ли этот инструмент? Или бы даже было бы полезно иметь его вообще лежать?

Редактировать : Я знаю, что в целом неразрешимо статистически проверять, может ли программа C ++ может выполнить что-то, которое имеет неопределенное поведение. Однако можно определить, является ли специфическое выполнение C ++ неопределенного поведения. Один из способов сделать это, чтобы сделать интерпретатор C ++, который шаги по коду в соответствии с определениями, изложенными в спецификации, при каждой точке определения того, имеет ли код неопределенным поведением. Это не обнаружит неопределенное поведение, которое не происходит в определенном выполнении программы, но оно найдет одно неопределенное поведение, которое фактически проявляется в программе. Это связано с тем, как он является узнаваемым, чтобы определить, принимает ли Tm какой-то вход, даже если он все еще неразрешен в целом.

Спасибо!

59
задан templatetypedef 6 August 2015 в 19:58
поделиться