Используется функция библиотеки sqrt
для обработки ошибок. См. Документацию glibc: 20.5.4. Отчеты об ошибках с помощью математических функций : набор математических функций errno
для совместимости с системами, которые не имеют флагов исключений IEEE754. Связано: glibc's math_error(7)
справочная страница.
В качестве оптимизации сначала пытается выполнить квадратный корень с помощью встроенной команды sqrtsd
, а затем проверяет результат на себя, используя ucomisd
, которая устанавливает флаги следующим образом:
blockquote>CASE (RESULT) OF UNORDERED: ZF,PF,CF 111; GREATER_THAN: ZF,PF,CF 000; LESS_THAN: ZF,PF,CF 001; EQUAL: ZF,PF,CF 100; ESAC;
В частности, сравнение
QNaN
с самим собой вернетUNORDERED
, что и будет get, если вы попытаетесь взять квадратный корень из отрицательного числа. Это распространяется на ветвьjp
. Проверкаje
- это просто паранойя, проверяющая точное равенство.Также обратите внимание, что gcc имеет параметр
-fno-math-errno
, который пожертвует этой обработкой ошибок для скорости. Этот параметр является частью-ffast-math
, но может использоваться сам по себе, не позволяя оптимизаторам, изменяющим результат.
sqrtsd
сам по себе производит NaN для отрицательных и NaN-входов и устанавливает IEEE754 Неверный флаг. Проверка и ветвь - только , чтобы сохранить семантикуerrno
-setting, на которую не полагается большинство кода.
-fno-math-errno
является значением по умолчанию в Darwin (OS X) , где математическая библиотека никогда не устанавливаетerrno
, поэтому функции могут быть встроены без этой проверки.
Любые теги script, отправленные на веб-форме ASP.NET, заставят Ваш сайт бросать и необработанное исключение.
можно использовать asp regex блок проверки допустимости, чтобы подтвердить вход, просто гарантировать, чтобы Вы обернули свой код позади метода с, если пункт (IsValid) в случае, если Ваш JavaScript обойден. Если Ваш клиент, JavaScript обойден и теги script, будет отправлен на Вашу форму asp.net, asp.net бросит необработанное исключение.
можно использовать что-то как:
<asp:RegularExpressionValidator ID="regexEmailValid" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ControlToValidate="tbEmail" ErrorMessage="Invalid Email Format"></asp:RegularExpressionValidator>
Вот основной почтовый блок проверки допустимости, который я просто создал на основе идеи Simon Johnson. Этому просто нужна дополнительная функциональность поиска DNS, добавляемого, если это требуется.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
using System.Web.UI;
namespace CompanyName.Library.Web.Controls
{
[ToolboxData("<{0}:EmailValidator runat=server></{0}:EmailValidator>")]
public class EmailValidator : BaseValidator
{
protected override bool EvaluateIsValid()
{
string val = this.GetControlValidationValue(this.ControlToValidate);
string pattern = @"^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*\.([a-z][a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$";
Match match = Regex.Match(val.Trim(), pattern, RegexOptions.IgnoreCase);
if (match.Success)
return true;
else
return false;
}
}
}
Обновление: не используйте исходный Regex. Ищите более новое больше полной выборки.
Можно использовать блок проверки допустимости RegularExpression. Свойство ValidationExpression имеет кнопку, которую можно нажать в панели свойства Visual Studio, которая добирается, перечисляет много полезных выражений. Тот, который они используют для адресов электронной почты:
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
Проверка этого, это - реальный адрес электронной почты, намного более трудна.
regex для подтверждения синтаксиса корректен, может быть очень длинным (см. http://www.regular-expressions.info/email.html , например). Лучший способ подтвердить адрес электронной почты состоит в том, чтобы послать пользователю по электронной почте и заставить пользователя отвечать путем нажимания на ссылку для проверки этого, они получили электронное письмо (способ, которым больше всего системы регистрации работают).
В нашем коде нам наследовали определенный блок проверки допустимости от класса BaseValidator.
Этот класс делает следующее:
Это является самым близким, можно добраться до проверки, на самом деле не отправляя человеку ссылку для подтверждения адреса электронной почты.
Предотвращение XSS является другим вопросом от проверки входа.
Относительно XSS: Вы не должны пытаться проверить , вводит для XSS или связанного использования. Необходимо предотвратить использование XSS, Внедрение SQL и так далее путем выхода правильно при вставке строк на различный язык, где некоторые символы являются "волшебными", например, при вставке строк в HTML или SQL. Например, имя как O'Reilly является совершенно допустимым входом, но могло вызвать катастрофический отказ или хуже, если вставлено незавершенный в SQL. Вы не можете предотвратить такие проблемы путем проверки входа.
Проверка ввода данных пользователем имеет смысл предотвращать то, чтобы избегать или некорректные данные, например, пользователя, пишущего "asdf" в поле индекса и так далее. Адреса электронной почты Wrt., синтаксис так сложен, хотя, что он не предоставляет много преимущества для проверки его с помощью regex. Просто проверьте, что это содержит.