Why no contracts for release build?

Andre via Digitalmars-d digitalmars-d at puremagic.com
Tue Jun 3 12:11:52 PDT 2014


Am 03.06.2014 19:13, schrieb Jonathan M Davis via Digitalmars-d:
> On Tue, 03 Jun 2014 16:29:20 +0200
> Andre via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>
>> Hi,
>> I currently think about whether or not contracts should be available
>> in release builds.
>>
>> Assuming a small example, you have an account class with a deposit
>> method, the input parameter must always be > 0.
>>
>> void deposit(int amount)
>> in
>> {
>>     enforce(amount > 0);
>> }
>> body
>> {
>>     this.amount += amount;
>> }
>>
>> If in release build the Contracts sections is removed, this means, I
>> also need to add in addition in another place the enforce method.
>> Otherwise in the productive scenario, this coding isn't secure
>> anymore. This leads to code duplication.
>>
>> I think Contracts are not a feature solely for unittests, they are a
>> fundamental part of classes/interfaces and theirfore should be
>> available in all builds.
>>
>> What do you think?
>
> Contracts are specifically intended for validating the input and output
> of a function with assertions. So, they're going to go away in any
> build that does not have assertions enabled. Contracts are very much
> the wrong place to use enforce. enforce throws an Exception and does
> not get compiled out. It is intended for error-handling rather than for
> validating the correctness of your code.
>
> - Jonathan M Davis
>

As I known that assertions are only for unittest purposes I hoped,
if I use enforce, this statements will not be removed in release build
and will still be executed - wrong.

I see, the idea of contracts in D differs to the idea of contracts e.g.
in Java (http://c4j-team.github.io/C4J/
Here contracts are used for unittest but also for the productive code
in release builds.

I thought about writing a Contracts library, which works similiar to C4J
but I see no chance to solve this issue without AST.

Kind regards
André



More information about the Digitalmars-d mailing list