Возможно ли иметь компилятор, который предсказывал бы каждую возможную «специфическую для ситуации» ошибку времени выполнения? - PullRequest
2 голосов
/ 04 октября 2009

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 04 октября 2009

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

3 голосов
/ 05 октября 2009

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

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

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

0 голосов
/ 05 октября 2009

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

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

0 голосов
/ 04 октября 2009

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

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

0 голосов
/ 04 октября 2009

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

0 голосов
/ 04 октября 2009

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

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

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

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

...