enforce()?

Walter Bright newshound2 at digitalmars.com
Sun Jun 20 14:17:28 PDT 2010


Vladimir Panteleev wrote:
> On Sun, 20 Jun 2010 03:04:31 +0300, Walter Bright 
> <newshound1 at digitalmars.com> wrote:
> 
>> Andrei Alexandrescu wrote:
>>> On 06/19/2010 03:55 PM, bearophile wrote:
>>>> Inside Phobos2 I have counted about 160 usages of the "body" keyword.
>>>> I think contract programming can be used more often inside Phobos2
>>>> (and maybe some usages of enforce() can be turned into contract
>>>> programming because they are more similar to program sanity checks).
>>>  Walter and I discussed this and concluded that Phobos should handle 
>>> its parameters as user input. Therefore they need to be scrubbed with 
>>> hard tests, not contracts.
>>
>> I should add that any library that may be used as a dll should have 
>> its interface API checked with hard tests, not contracts. This is 
>> because a dll cannot control who connects to it, and therefore must 
>> regard anything sent to it as unvalidated user input.
> 
> I don't see the logic in this...
> 
> Are we talking about validating user input for the sake of security, or 
> debugging (catching bugs early)?

An input to a dll is user input, and should be validated (for the sake of 
security, and other reasons). Validating it is not debugging.


> If it's for the sake of debugging, debug checks should remain in debug 
> builds (that's what contracts are for?). Otherwise, you are stripping 
> the programmer of the choice between higher performance or more debug 
> checks.
> 
> If it's for the sake of security - parameter validation in DLLs is 
> pointless. If you are able to load and call code from inside a DLL, you 
> are already able to do everything that the DLL can. DLLs don't have any 
> "setuid"-like properties. If we were talking, for example, about 
> syscalls for a kernel module (functions called from userland but 
> executed in kernel land), then that would be a completely different 
> situation.

If you, for example, provide a pluggable interface to your browser app, that's 
done using a dll, and you'd better validate anything you get through that plugin 
interface!

> Also, I don't think that one rule can apply for everyone. For example, a 
> high-performance DLL may specify in its documentation that the function 
> parameters are not checked by the DLL and must be valid, otherwise 
> undefined behavior will occur. (I believe some Windows APIs do not check 
> some parameters and will cause access violations when called with 
> invalid parameters.)

If you don't validate the input, then you must accept the risk.


More information about the Digitalmars-d mailing list