digitalmars.D - Untested return values.
- Lionello Lunesu (10/10) Oct 03 2006 What would happen if DMD would issue a compiler warning for untested
- Frits van Bommel (6/21) Oct 03 2006 I regularly use functions I don't need the return values of, so I
- Hasan Aljudy (3/28) Oct 03 2006 LOL, really?
- Frits van Bommel (14/43) Oct 03 2006 from http://www.cplusplus.com/ref/cstdio/printf.html (at bottom):
- Walter Bright (7/17) Oct 03 2006 I tried this back in the '80s. It's one of those things that sure sounds...
- Andrei Khropov (6/14) Oct 04 2006 Well, it depends on a particular syntax.
- Lionello Lunesu (4/20) Oct 05 2006 That's true! How about: "void = printf()", similar to the void
- Kristian (36/56) Oct 05 2006 =
- Lionello Lunesu (23/77) Oct 05 2006 If you don't care whether the file got deleted, why do you delete it in
- Kristian (15/30) Oct 05 2006 [snip]
- Lionello Lunesu (4/42) Oct 05 2006 In D, warnings are off by default. You explicitly ask for warnings using...
- =?ISO-8859-15?Q?Anders_F_Bj=F6rklund?= (4/9) Oct 05 2006 Also, in D *all* warnings are errors. So the "-w" flag to DMD is the
- Lionello Lunesu (6/29) Oct 03 2006 Damn that printf :S
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (4/6) Oct 03 2006 You're in good company then, the language's author agrees with you :-)
- Walter Bright (2/3) Oct 04 2006 It just moved.
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (7/8) Oct 04 2006 OK, so there might be a "import std.c.stdio;" to
-
Walter Bright
(2/8)
Oct 04 2006
I mean the parrot moved
. - =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (4/8) Oct 04 2006 No, it didn't, that was you hitting the cage! ;-)
- Hasan Aljudy (2/11) Oct 04 2006 what parrot?
- Pragma (9/23) Oct 04 2006 This parrot:
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (5/9) Oct 04 2006 See also:
What would happen if DMD would issue a compiler warning for untested return values? bool somefunc() { ... } void main() { somefunc();//warning: untested return value auto b = somefunc();//OK } Especially useful for C or OS functions returning error values or handles. L. PS. might even be worth a compiler error.
Oct 03 2006
Lionello Lunesu wrote:What would happen if DMD would issue a compiler warning for untested return values? bool somefunc() { ... } void main() { somefunc();//warning: untested return value auto b = somefunc();//OK } Especially useful for C or OS functions returning error values or handles. L. PS. might even be worth a compiler error.I regularly use functions I don't need the return values of, so I wouldn't like this change. On the other hand, Walter might stop using printf() all over Phobos... :P Nah, not worth it. Besides, the fact that functions like printf() have a return value is probably enough reason for Walter not to make such a change.
Oct 03 2006
Frits van Bommel wrote:Lionello Lunesu wrote:LOL, really? What does printf return? (what about writef?)What would happen if DMD would issue a compiler warning for untested return values? bool somefunc() { ... } void main() { somefunc();//warning: untested return value auto b = somefunc();//OK } Especially useful for C or OS functions returning error values or handles. L. PS. might even be worth a compiler error.I regularly use functions I don't need the return values of, so I wouldn't like this change. On the other hand, Walter might stop using printf() all over Phobos... :P Nah, not worth it. Besides, the fact that functions like printf() have a return value is probably enough reason for Walter not to make such a change.
Oct 03 2006
Hasan Aljudy wrote:Frits van Bommel wrote:from http://www.cplusplus.com/ref/cstdio/printf.html (at bottom): ----------- *Return Value.* On success, the total number of characters printed is returned. On error, a negative number is returned. ----------- I suppose it could be used if want to align the next output to a specific column without fixing all the fields to specific lengths. Though the %n specifier could also be used for that[1]. [1] If you don't know what it does, don't worry. It's another obscure fact of printf(): %n accepts an int* that's filled with the number of characters printed so far. I believe it's main use is in format string exploits :P.Lionello Lunesu wrote:LOL, really? What does printf return? (what about writef?)What would happen if DMD would issue a compiler warning for untested return values? bool somefunc() { ... } void main() { somefunc();//warning: untested return value auto b = somefunc();//OK } Especially useful for C or OS functions returning error values or handles. L. PS. might even be worth a compiler error.I regularly use functions I don't need the return values of, so I wouldn't like this change. On the other hand, Walter might stop using printf() all over Phobos... :P Nah, not worth it. Besides, the fact that functions like printf() have a return value is probably enough reason for Walter not to make such a change.
Oct 03 2006
Frits van Bommel wrote:Lionello Lunesu 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>.What would happen if DMD would issue a compiler warning for untested return values?I regularly use functions I don't need the return values of, so I wouldn't like this change. On the other hand, Walter might stop using printf() all over Phobos... :P Nah, not worth it. Besides, the fact that functions like printf() have a return value is probably enough reason for Walter not to make such a change.
Oct 03 2006
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();" -- AKhropov
Oct 04 2006
Andrei Khropov wrote:Walter Bright wrote:That's true! How about: "void = printf()", similar to the void initializer "int[] x = void;" L.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();"
Oct 05 2006
On Thu, 05 Oct 2006 12:26:11 +0300, Lionello Lunesu = <lio 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=g =return value is legitimately ignored (like printf's), so you wind up fillin==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 " _ =3D SomeFunc();"That's true! How about: "void =3D printf()", similar to the void =initializer "int[] x =3D void;" L.Well, I ignore return values of functions a lot. For example, 'eraseFile()' returns true if a file was deleted or false o= n = 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 no= t = always wanted). The return value of such functions is a 'side effect', not the main thin= g. = 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. 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. One solution could be to tell the compiler that a function belongs to th= e = group B. For example: pure double sqrt(double val); void func() { double x; sqrt(2.0); //error x =3D sqrt(2.0); //ok } Notice a new keyword 'pure'.
Oct 05 2006
Kristian wrote:On Thu, 05 Oct 2006 12:26:11 +0300, Lionello Lunesu <lio lunesu.remove.com> wrote: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.Andrei Khropov wrote: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).Walter Bright wrote:That's true! How about: "void = printf()", similar to the void initializer "int[] x = void;" L.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();"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.
Oct 05 2006
On Thu, 05 Oct 2006 14:45:42 +0300, Lionello Lunesu <lio lunesu.remove.com> wrote:Kristian wrote:[snip]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.Ok, ok, maybe my 'eraseFile()' example wasn't the best one... :) I can't resist (sorry) pointing out that sometimes it's ok to silently ignore errors. ;) For example, there is a program that creates a temporary file. When the program is exited, the file will be deleted. Now, if the file cannot be deleted for some reason, what could you do? Notify the user with a message box telling that "Cannot delete the XXX file." or "Please delete the XXX file, or else!..." (that would annoy me, at least), or silently accept the fact that the file cannot be deleted and exit the program? *grin* (Thanks for pointing out the usage of exceptions in D, though.)A warning message with an ability to turn it off? Or as I would prefer, a warning with an ability turn it on (it's off by default)?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.
Oct 05 2006
Kristian wrote:On Thu, 05 Oct 2006 14:45:42 +0300, Lionello Lunesu <lio lunesu.remove.com> wrote:Like I said: point taken :)Kristian wrote:[snip]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.Ok, ok, maybe my 'eraseFile()' example wasn't the best one... :) I can't resist (sorry) pointing out that sometimes it's ok to silently ignore errors. ;) For example, there is a program that creates a temporary file. When the program is exited, the file will be deleted. Now, if the file cannot be deleted for some reason, what could you do? Notify the user with a message box telling that "Cannot delete the XXX file." or "Please delete the XXX file, or else!..." (that would annoy me, at least), or silently accept the fact that the file cannot be deleted and exit the program? *grin*In D, warnings are off by default. You explicitly ask for warnings using -w. L.A warning message with an ability to turn it off? Or as I would prefer, a warning with an ability turn it on (it's off by default)?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.
Oct 05 2006
Lionello Lunesu wrote:Also, in D *all* warnings are errors. So the "-w" flag to DMD is the same as passing "-Wall -Werror" to GCC when compiling C/C++ sources. --andersA warning message with an ability to turn it off? Or as I would prefer, a warning with an ability turn it on (it's off by default)?In D, warnings are off by default. You explicitly ask for warnings using -w.
Oct 05 2006
"Frits van Bommel" <fvbommel REMwOVExCAPSs.nl> wrote in message news:eftv4g$2ueh$1 digitaldaemon.com...Lionello Lunesu wrote:Damn that printf :S I actually use the printf in D quite a lot, but only because it's there. If writefln would be imported by default I'd use that instead. L.What would happen if DMD would issue a compiler warning for untested return values? bool somefunc() { ... } void main() { somefunc();//warning: untested return value auto b = somefunc();//OK } Especially useful for C or OS functions returning error values or handles. L. PS. might even be worth a compiler error.I regularly use functions I don't need the return values of, so I wouldn't like this change. On the other hand, Walter might stop using printf() all over Phobos... :P Nah, not worth it. Besides, the fact that functions like printf() have a return value is probably enough reason for Walter not to make such a change.
Oct 03 2006
Lionello Lunesu wrote:I actually use the printf in D quite a lot, but only because it's there.If writefln would be imported by default I'd use that instead.You're in good company then, the language's author agrees with you :-) Seriously, it's in the wrong header. And it's pining for the fjords... --anders
Oct 03 2006
Anders F Björklund wrote:Seriously, it's in the wrong header. And it's pining for the fjords...It just moved.
Oct 04 2006
Walter Bright wrote:It just moved.OK, so there might be a "import std.c.stdio;" to insert in a couple of files to make them compile ? Much better now than after the initial D release... This should also help promote writef, which is good. Thanks Walter, --anders
Oct 04 2006
Anders F Björklund wrote:Walter Bright wrote:I mean the parrot moved <g>.It just moved.OK, so there might be a "import std.c.stdio;" to insert in a couple of files to make them compile ?
Oct 04 2006
Walter Bright wrote:No, it didn't, that was you hitting the cage! ;-) Too bad. --andersOK, so there might be a "import std.c.stdio;" to insert in a couple of files to make them compile ?I mean the parrot moved <g>.
Oct 04 2006
Walter Bright wrote:Anders F Björklund wrote:what parrot?Walter Bright wrote:I mean the parrot moved <g>.It just moved.OK, so there might be a "import std.c.stdio;" to insert in a couple of files to make them compile ?
Oct 04 2006
Hasan Aljudy wrote:Walter Bright wrote:This parrot: http://www.mtholyoke.edu/~ebarnes/python/dead-parrot.htm IMO, it's right up there with "Who's on First", although Palin and Cleese's delivery on the small screen is far more hilarious than what you'll see on the page. And now for something completely different. -- - EricAnderton at yahooAnders F Björklund wrote:what parrot?Walter Bright wrote:I mean the parrot moved <g>.It just moved.OK, so there might be a "import std.c.stdio;" to insert in a couple of files to make them compile ?
Oct 04 2006
Pragma wrote:This parrot: http://www.mtholyoke.edu/~ebarnes/python/dead-parrot.htmSee also: http://www.digitalmars.com/d/archives/digitalmars/D/bugs/5838.htmlAnd now for something completely different.Indeed. Those sketches are for another programming language. :-) --anders
Oct 04 2006