Untested return values.
Lionello Lunesu
lio at lunesu.remove.com
Thu Oct 5 04:45:42 PDT 2006
Kristian wrote:
> On Thu, 05 Oct 2006 12:26:11 +0300, Lionello Lunesu
> <lio at lunesu.remove.com> wrote:
>
>> Andrei Khropov wrote:
>>> Walter Bright wrote:
>>>
>>>> I tried this back in the '80s. It's one of those things that sure
>>>> sounds like
>>>> a good idea. The problem is, there are just too many cases where the
>>>> return
>>>> value is legitimately ignored (like printf's), so you wind up
>>>> filling your
>>>> code with chaff like:
>>>>
>>>> cast(void) printf( ... );
>>>>
>>>> After a few dozen of those, it starts looking like a bad idea <g>.
>>> Well, it depends on a particular syntax. In Nemerle for example it's
>>> just " _ = SomeFunc();"
>>>
>>
>> That's true! How about: "void = printf()", similar to the void
>> initializer "int[] x = void;"
>>
>> L.
>
> Well, I ignore return values of functions a lot.
>
> For example, 'eraseFile()' returns true if a file was deleted or false
> on failure. Usually I don't care what the return value is: if the file
> couldn't be deleted, too bad, there is not much that I can do about it
> (except possibly notify the user by opening a message box, but that's
> not always wanted).
If you don't care whether the file got deleted, why do you delete it in
the first place? OK, I know very well what you're trying to say and I do
it myself all the time, but I'll also admit that it's sloppy programming.
Furthermore, 'the D way' is to throw an exception, not to return some
value that is or is not tested.
By the way, do you often use
try { /* some code*/ } catch (Object o) {/* no code*/}
too? They should, since the same reasoning applies to function throwing
an exception.
> The return value of such functions is a 'side effect', not the main
> thing. Lets say that these functions belong to a group A. There are also
> functions whose 'main thing' is their return value. There may or may not
> be some 'side effects' when they are called. These functions belong to a
> group B.
eraseFile returning 'false' is not a side-effect, it is the main thing
not being done. A side effect would be printf returning the number of
characters written.
> Clearly you wouldn't want to do any extra work when calling functions of
> the group A. Or have warning/error messages with them. However, with the
> group B that would be ok.
Granted, so perhaps it could be a warning message after all. Definately
not an error, we've established that.
> One solution could be to tell the compiler that a function belongs to
> the group B. For example:
>
> pure double sqrt(double val);
>
> void func() {
> double x;
>
> sqrt(2.0); //error
> x = sqrt(2.0); //ok
> }
>
> Notice a new keyword 'pure'.
I like that. It's actually enabling that specific warning/error message
on a per function basis. Functions returning handles to resources or
fatal return values (mostly C libraries probably) could be tagged with
this identifier and the compiler will then make sure the return value is
actually used...
This is like a contract, in a way, for the caller of the function (as
opposed to contact for the implementor.)
L.
More information about the Digitalmars-d
mailing list