digitalmars.D.bugs - [Issue 3847] New: To avoid a C code bug
- d-bugmail puremagic.com (49/49) Feb 23 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (15/44) Feb 23 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (13/13) Feb 23 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (14/15) Feb 27 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (16/16) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (13/13) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (42/42) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (16/16) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (15/15) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (14/14) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (13/13) May 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (28/29) Sep 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (23/36) Sep 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (21/31) Sep 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (11/11) Sep 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
- d-bugmail puremagic.com (9/11) Sep 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3847
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Summary: To avoid a C code bug Product: D Version: 2.040 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc What does this D2 program print, and why? import std.stdio; bool thirdElementIsThree(int[] a) { return a.length >= 3 & a[2] == 3; } void main() { int[][] tests = [[6, 5, 4, 3, 2, 1], [1, 2], [1, 2, 3], [1, 2, 3, 4 ], [1]]; int n = 0; try { int i = 0; while (true) { if (thirdElementIsThree(tests[i++])) n++; } } catch(Error e) { // No more tests to process } writeln(n); // prints? } Using 'and' and 'or' instead of && and || helps reduce some possible programmer mistakes, because the programmer may write & or | and the compiler may not catch the mistake. Using those keyword (as in Python and many other languages) avoids such mistakes, and C programmer will not be confused by this change because the || and && becomes deprecated, as the 'l' suffix for numbers. 'and' and 'or' are also quite less cryptic than && and || symbols. && and || can be kept to keep C compatibility, but their usage can be discouraged in new normal D2 code. In real code it happens to write a & where you want to write &&, this is not an uncommon bug. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 23 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Ellery Newcomer <ellery-newcomer utulsa.edu> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ellery-newcomer utulsa.edu 18:39:12 PST ---What does this D2 program print, and why? import std.stdio; bool thirdElementIsThree(int[] a) { return a.length >= 3 & a[2] == 3; } void main() { int[][] tests = [[6, 5, 4, 3, 2, 1], [1, 2], [1, 2, 3], [1, 2, 3, 4 ], [1]]; int n = 0; try { int i = 0; while (true) { if (thirdElementIsThree(tests[i++])) n++; } } catch(Error e) { // No more tests to process } writeln(n); // prints? }Ooh! Ooh! I know! it segfaults because the loop doesn't terminate and eventually test[i++] attempts to access memory not allocated to that process! We're talking about things that would happen in C, right? Personally, I prefer and,or, etc over &&,||, etc because they take less finger gymnastics to type. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 23 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 BCS <shro8822 vandals.uidaho.edu> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |shro8822 vandals.uidaho.edu --- In order of preference: 1: close a won't fix, 'is' and 'in' are bad enought,we don't need more keyword-as-operators 2: replace the less common bitwise operators '&' and '|' with 'and' & 'or' -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 23 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Stewart Gordon <smjg iname.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |smjg iname.com2: replace the less common bitwise operators '&' and '|' with 'and' & 'or'I somehow think that would confuse people, who generally expect 'and' and 'or' to be logical rather than bitwise. Though people coming from certain M$ Basic backgrounds have instead to deal with boolean true being 1 rather than -1. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 27 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 and, or operators exist in C++: http://en.wikipedia.org/wiki/Iso646.h This C++ code compiles: #include "stdio.h" #include "stdlib.h" int main() { bool a = atoi("1"); bool b = atoi("1"); bool c = atoi("0"); printf("%d\n", (a and b) or c); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bugzilla digitalmars.com 11:00:26 PDT --- C++ has had the 'and' and 'or' alternate keywords for well over a decade. To my knowledge, nobody uses them, and few C++ programmers even know they exist. It's a failure. Therefore, I don't think it is a good idea to adopt them. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Adam D. Ruppe <destructionator gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |destructionator gmail.com 11:26:55 PDT --- I think we should replace all the operators to avoid bugs. = should be changed to SET_TO == should be changed to IS_EQUAL_TO + should be changed to ADD - should be SUBTRACT a++ should be INCREMENT_AND_RETURN_OLD_VALUE ++a should be INCREMENT and so on. This way, the user's intention is always clear because he has to type out the value. Each has a different length and/or starts with a different letter to aid in autocomplete and noticing if the autocomplete picks the wrong one. Check out how clear this code is: for(a SET_TO 0 TERMINATE_INITIALIZATION a LESS_THAN 10 TERMINATE_CONTINATION_CONDITION INCREMENT a) { if(a LESS_THAN 5 AND a REMAINDER_AFTER_VALUE_DIVIDED_BY 2 IS_EQUAL_TO 0) writefln("%INTEGER_FORMAT", a); } Amazing and guaranteed to be bug free! ---------- So seriously now, how many times have you written & when you meant && and not noticed it quickly? If anything were to change here, I'd say the rules on implicit conversion to boolean should he changed, not the operator. (And, ideally, the bitwise precidence!) Then you'd do bool f(int x) { return x & 1; // compile error - can't implicitly cast int to bool } bool f(int x) { return (x & 1) == 1; // works } But I doubt this is a problem often enough to warrant any change. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 In C++ no one used them. But it can be just a matter of nudging D programmers in the right direction with the style guide and commonly accepted idioms for writing D code fist, and few years from now with warnings of deprecation of the bug-prone || &&, before removing them from some future version. Python uses the "and" and "or" and shows how better they are: they just look better and more natural, are simpler and faster to type, they make the code less visually noisy, are written as they are read aloud, and they avoid some bugs like the one I've shown at the top (the presence of such bugs can be seen from the fact that both the Gimpel lint warns about an error like the one of the original top, and recent GCC versions have warning for such probably erroneous usage of bitwise operators). It's a change for the better. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Brad Roberts <braddr puremagic.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |braddr puremagic.com --- 'and' is isn't particularly less ambiguous than && vs &. The use of a word doesn't help tell me logical vs bitwise. Additionally, if you're going to word-ize some of the logical operators, you'd better do that for all of them.. so don't forget exclusiveor and equals and lessthan and... Rather than let this ticket become a debated endlessly ticket, given Walter's response, I suggest it be closed as wontfix aka notabug. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Ary Borenszweig <ary esperanto.org.ar> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ary esperanto.org.ar PDT --- 'and' and 'or' also help with readability. The thing is, you can make mistakes with && and &. You can't make mistakes with 'and' and '&'. Nobody used 'and' and 'or' as variables or function names so I don't think it's a problem at all to add them as synonymous to && and ||. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 21:14:14 PDT --- Just today on reddit I saw: "I'm a bit embarrassed that after 10 years with C++ I learned something from a 12-bullet post intended for those new to the language. I'm amazed to learn that C++ has those built-in arithmetic keyword operators. I can't really see myself using them -- for various reasons -- but it's an interesting tidbit nonetheless." http://www.reddit.com/r/programming/comments/bzcgn/c_for_c_programmers_part_12_the_nonoo_features/ It sums up the typical attitude I've seen towards them. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847It sums up the typical attitude I've seen towards them.Some C++ programmers don't even know about 'and' and 'or' because the C++ compilers do nothing to suggest, encourage or force the usage of those more readable and less bug-prone operators. The D compiler can avoid that trouble if somehow && || become a legacy or deprecated (but probably supported still) feature. It's also a matter of idioms and customs: D is a new language, it's not just an extension of the C language. So new D users usually accept the need to learn new customs and new idioms specific of the D language. D does many things differently from D (and even when it accepts C syntax, it's quite discouraged, like using "int a[];"). If D style guides, standard library, newsgroups, and books use 'and' and 'or' operators, new D programmers will use them. Thanks to bug 4077, a problem is now mitigated, if the original program with the thirdElementIsThree() function is compiled with dmd 2.049 plus warnings, the compiler shows: test.d(4): a.length >= 3 must be parenthesized when next to operator & test.d(4): a[2] == 3 must be parenthesized when next to operator & But fixing bug 4077 doesn't help bugs like: void main() { bool a, b; if (a & b) {} } The usage of 'and' and 'or' operators avoids this class of bugs too. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 20 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847Some C++ programmers don't even know about 'and' and 'or' because the C++ compilers do nothing to suggest, encourage or force the usage of those more readable and less bug-prone operators. The D compiler can avoid that trouble if somehow && || become a legacy or deprecated (but probably supported still) feature.But because && and || are by far the most commonly used forms, and probably most modern languages with C-derived syntax are designed on this very basis, deprecating them would probably confuse the programmer by making D the odd one out. Moreover, a trend that has distinguished C and its derivatives from Pascal, Fortran, SQL et al is the tendency to make use of symbols, thereby keeping down the number of keywords in the language. D has continued this trend by doing away with the little-used and and or. OK, so D has is and in, but these aren't things for which other C-like languages have symbols (at least, I'm not sure if JS/PHP === is similar enough to count).If D style guides, standard library, newsgroups, and books use 'and' and 'or' operators, new D programmers will use them.And maybe get confused when they find that they don't behave in the same way as in Perl and PHP. Probably the obscurity of C's and/or has meant that the designers of Perl and PHP saw nothing wrong with changing the precedence. (Though why PHP's designer saw fit to change the associativity of ?: is a mystery I haven't solved.)But fixing bug 4077 doesn't help bugs like: void main() { bool a, b; if (a & b) {} }How's that a bug? When a and b are bools, they behave the same! -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 20 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 bearophile_hugs eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED Stewart Gordon:But because && and || are by far the most commonly used forms, and probably most modern languages with C-derived syntax are designed on this very basis, deprecating them would probably confuse the programmer by making D the odd one out.I understand this. On the other hand Python and Delphi use 'or' and 'and' (Python is partially derived from C). I know some Python programmers interested in D.D has continued this trend by doing away with the little-used and and or.And D uses a semicolon where Java uses 'implements' and 'extends'.OK, so D has is and in, but these aren't things for which other C-like languages have symbolsIn Python 'is' and 'in' have similar semantics.And maybe get confused when they find that they don't behave in the same way as in Perl and PHP.Probably this is a confusion for D newbies only, while what I have suggested is meant to help life of normal D programmers.How's that a bug? When a and b are bools, they behave the same!OK. I close this enhancement request. If I will find other bug-prone situations I will reopen it. Thank you. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 20 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 Brad Roberts <braddr puremagic.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|FIXED |WONTFIX PDT --- It's not 'fixed'. It's either 'invalid' or 'wontfix' or 'notabug'. I'd prefer the latter, but since it's not available, going with 'wontfix'. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 20 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3847 ---more readable and less bug-prone operators.Franky I find the fact that && and || are not keywords make them *More* readable and as a result *Less* bug-prone. But there's no accounting for taste, yours or mine. One point to you, 1 point to me and Walter has trump. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 20 2010