[m-rev.] for review: avoid undefined behaviour of int.abs.

Julien Fischer jfischer at opturion.com
Mon Jan 15 10:59:12 AEDT 2018



On Mon, 15 Jan 2018, Peter Wang wrote:

> On Sun, 14 Jan 2018 11:56:35 -0500 (EST), Julien Fischer <jfischer at opturion.com> wrote:
>>
>> For review by anyone.
>>
>> The following is what was discussed back in Oct. 2016, except that I
>> haven't added a new exception type specific for overflows (yet).
>>
>> I will do something similar for ther other signed integer types once
>> this is reviewed adn committed.
>>
>> -----------------------
>>
>> Avoid undefined behaviour of int.abs.
>>
>> library.m:
>>      Make int.abs throw an exception for int.min_int.
>>
>>      Add the new function unchecked_abs/1, whose behaviour is
>>      undefined for int.min_int.
>>
>>      Add the new function nabs/1 which computes the negative
>>      absolute value of an int   Unlike abs, this is defined for
>>      all ints.
>
> Full stop.

Fixed.

>> diff --git a/library/int.m b/library/int.m
>> index 4dad325..e0b7cd6 100644
>> --- a/library/int.m
>> +++ b/library/int.m
>> @@ -1,7 +1,8 @@
>>   %---------------------------------------------------------------------------%
>>   % vim: ft=mercury ts=4 sw=4 et
>>   %---------------------------------------------------------------------------%
>> -% Copyright (C) 1994-2011 The University of Melbourne.
>> +% Copyright (C) 1994-2012 The University of Melbourne.
>> +% Copyright (C) 2013-2018 The Mercury team.
>>   % This file may only be copied under the terms of the GNU Library General
>>   % Public License - see the file COPYING.LIB in the Mercury distribution.
>>   %---------------------------------------------------------------------------%
>> @@ -52,11 +53,24 @@
>>
>>   %---------------------------------------------------------------------------%
>>
>> -    % Absolute value.
>> +    % abs(X) returns the absolute value of X.
>> +    % Throws an exception if X = int.min_int.
>>       %
>>   :- func abs(int) = int.
>>   :- pred abs(int::in, int::out) is det.
>>
>> +    % unchecked(X) returns the absolute value of X, except that the result is
>
> unchecked_abs

Fixed.

Julien.


More information about the reviews mailing list