Возможно ли иметь компилятор, который предсказывал бы каждую возможную "специфическую для ситуации" ошибку времени выполнения?

Под "конкретной ситуацией" я подразумеваю, что он использует некоторые данные, к которым у него будет доступ, например, текущую настройку базы данных, версию некоторой ОС и т. Д.

Представьте, что компилятор проверит базу данных, которую вы в данный момент используете в своем приложении, и выдаст предупреждение "просто чтобы вы знали, что текущие данные в вашей базе данных никогда не вызовут только что написанное вами утверждение" или что-то вроде "вы знаете, если это становится нулевым значением, вы действительно собираетесь быть испорченным"... Это может занять некоторое время, но если у него есть что-то, что нужно пройти (например, текущая база данных), у него может быть что-то, с чем можно проверить, а не просто" каждая возможность ".

Как вы думаете, это осуществимо / ценно? Это существует где-нибудь?

Было бы здорово иметь квантовый компилятор, который бы вычислял все возможности и автоматически придумывал обработку исключений и т. Д.

6 ответов

Решение

Это теоретически возможно, но маловероятно. По сути, вы просите статический анализ использовать некоторые вспомогательные данные для проверки какой-либо заявки. Как правило, это возможно, но статический анализ в целом страдает степенью неточности. Например, если у меня есть блок кода:

If(getResultFromDB() == someResult) {
do this;
} else {
do that;
}

По сути, вы хотели бы, чтобы анализ жаловался на вас, если вы пишете код в первом блоке if, потому что база данных никогда не сможет вернуть someResult. Это возможно в теоретическом смысле, я имею в виду, что нужно просто изучить все возможные возвращаемые значения для функции getResultFromDB() для данной базы данных, а затем сделать вывод об ответе.

Проблема в том, что это число может быть абсолютно массовым. И это вообще проблема статического анализа, чтобы получить точные результаты, нам нужно учесть ВСЕ возможные пути выполнения, входные данные, контексты и т. Д. На практике это просто невозможно, поэтому статический анализ обычно идет на уступки там, где он сокращается. размер его текущего набора возможностей.

Изменить: Если вы заинтересованы в расширенном статическом анализе в целом, вот интересный анализ, о котором я читал на днях. Он пытается найти возможные XSS-атаки в исходном коде PHP. Чтобы найти XSS-атаки с использованием баз данных, он фактически моделирует эффекты запросов к базе данных в некой абстрактной базе данных. http://www.cs.washington.edu/homes/mernst/pubs/create-attacks-tr054.pdf

Я не могу этого гарантировать, но это кажется изоморфным проблеме Остановки, которая, как известно, невозможна.

Как подозревает Джеймс, это изоморфно проблеме Остановки и, следовательно, невозможно доказать.

Фактически, эту проблему можно легко свести к компиляции Perl (потому что Perl требует знания, зависящего от ситуации). Существует простое, элегантное доказательство того, что Perl на самом деле не может быть скомпилирован.

Таким образом, у нас есть как минимум один контрпример (Perl), где статический компилятор не может проверить правильность программы, что противоречит гипотезе. QED

Похоже, вы говорите о сложной форме анализа потока данных. Этот метод используется существующими компиляторами и широко используется инструментами статического анализа. Вероятно, в настоящее время нет такого продвинутого инструмента, как вы предлагаете, но это не значит, что его нельзя создать, если уделить достаточно времени и исследований.

Этого не существует нигде, о чем я знаю (пока). Однако мне очень нравится идея гуманизированных сообщений об ошибках:

You know, if this becomes a null value you are really going to be screwed.

Относительно того, возможно ли это: я бы сказал, что со временем все может произойти, так что кто на самом деле знает (и кто я такой, чтобы предсказывать будущее).

Это ценно: ДА! Это сэкономило бы много времени, и если бы оно сделало то, что вы сказали, придумав обработку исключений, это было бы одним из самых полезных инструментов за всю историю. КОГДА-ЛИБО!!!

Хотя эту проблему невозможно решить полностью, есть некоторые попытки сделать статический анализ как можно более умным, но одна из них - NStatic от Wesner Moise - имеет довольно высокие ожидания (это также может быть причиной того, что инструмент не поставляется и, похоже, не будет в ближайшее время:))

http://wesnerm.blogs.com/net_undocumented/nstatic/

Другие вопросы по тегам