On Wednesday, 3 April 2013 at 14:32:59 UTC, Steven Schveighoffer wrote:
On Wed, 03 Apr 2013 01:59:32 -0400, Lars T. Kyllingstad <[email protected]> wrote:

Say I am writing a function that you are using. I don't trust you to always give me correct parameters, so I check them. (Maybe my function could even do something dangerous if I didn't.)

  public void myFunction(someArgs)
  {
      if (someArgs are invalid)
          throw new InvalidArgumentError;
      ...
  }

I disagree here. There are two "users" involved, one is the actual user, typing a command on the command line, and then the developer who uses the function. The developer should be checked with assert, the user should be checked with code like you wrote.

The problem becomes apparent when developers don't check user input before passing to your functions. That is on them, not you. The library should be able to have all the safety checks removed to improve performance.

Some, yes, but not all. You always have to weigh the benefit, i.e. the improved performance, against the drawbacks, i.e. reduced safety. If you are removing trivial safety checks from a function that performs a very expensive and possibly dangerous operation -- a disk operation, say -- you're doing something wrong.

I agree it should be possible to remove safety checks from functions which are expected to be performant, and where the checks will have an impact (e.g. the range primitives), but it should be done with a less attractive compiler switch than -release.

I think it's a big mistake to encourage programmers to ship their programs with array bounds checks and the like disabled. Such programs should be the exception, not the rule. It's always better to err on the side of safety rather than performance.


I wish there was a way to say "this data is unchecked" or "this data is checked and certified to be correct" when you call a function. That way you could run the in contracts on user-specified data, even with asserts turned off, and avoid the checks in release code when the data has already proven valid.

That would be awesome indeed.

Lars

Reply via email to