input validation

Max Samukha samukha at voliacable.com.removethis
Wed Mar 4 09:09:52 PST 2009


On Wed, 04 Mar 2009 08:47:50 -0800, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:

>Sean Kelly wrote:
>> Georg Wrede wrote:
>>> The distinction is not whether you or others write stuff. It's about 
>>> whether it is for debugging *only*, as opposed to general input 
>>> validation.
>> 
>> So I guess the real question is whether a function is expected to 
>> validate its parameters.  I'd argue that it isn't, but then I'm from a 
>> C/C++ background.  For me, validation is a debugging tool, or at least 
>> an optional feature for applications that want the added insurance.
>
>Interesting. My policy is to favor validation whenever it doesn't impact 
>performance. Imagine for example that strlen() validated its input for 
>non-null. Would that show on the profiling chart of any C application? 
>No, unless the application's core loop only called strlen() on a 
>1-character string or so.
>
>One simple case that clarifies the necessary tradeoff is binary search. 
>That assumes the range to be searched is sorted. If you actually checked 
>for that, it would render binary search useless as a linear search would 
>be in fact faster. So you need to assume. One way to do so is in the 
>documentation. You write in the docs that findSorted expects a sorted 
>range. Another way is to encode this information in the type of the 
>sorted range. But that's onerous as most of the time you have an array 
>you just sorted, not a SortedArray value.
>
>The approach I took with the new phobos is:
>
>int[] haystack;
>int[] needle;
>...
>auto pos1 = find(haystack, needle); // linear
>sort(haystack);
>auto pos2 = find(assumeSorted(haystack), needle);
>
>The assumeSorted function wraps the haystack in an AssumeSorted!(int[]) 
>type without adding members or running extra code. It's there to clarify 
>to everyone what's going on. And it's usable with other arguments or 
>functions too, e.g.
>
>auto pos3 = find(haystack, assumeSorted(needle));
>setIntersection(assumeSorted(haystack), assumeSorted(needle));
>
>Interestingly, assumeSorted can actually do checking without impacting 
>the complexity of the search. In debug mode, it can arrange to run 
>random isSorted tests every 1/N calls, where N is the average length of 
>the incoming arrays, then its complexity impact is amortized constant.
>
>
>Andrei

If you intruduce a dummy type, why not make it perform validation in a
debug build when sumthing like debug=slowButSafe is set?



More information about the Digitalmars-d mailing list