Возможно ли иметь компилятор, который предсказывал бы каждую возможную "специфическую для ситуации" ошибку времени выполнения?
Под "конкретной ситуацией" я подразумеваю, что он использует некоторые данные, к которым у него будет доступ, например, текущую настройку базы данных, версию некоторой ОС и т. Д.
Представьте, что компилятор проверит базу данных, которую вы в данный момент используете в своем приложении, и выдаст предупреждение "просто чтобы вы знали, что текущие данные в вашей базе данных никогда не вызовут только что написанное вами утверждение" или что-то вроде "вы знаете, если это становится нулевым значением, вы действительно собираетесь быть испорченным"... Это может занять некоторое время, но если у него есть что-то, что нужно пройти (например, текущая база данных), у него может быть что-то, с чем можно проверить, а не просто" каждая возможность ".
Как вы думаете, это осуществимо / ценно? Это существует где-нибудь?
Было бы здорово иметь квантовый компилятор, который бы вычислял все возможности и автоматически придумывал обработку исключений и т. Д.
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 - имеет довольно высокие ожидания (это также может быть причиной того, что инструмент не поставляется и, похоже, не будет в ближайшее время:))