← Back to context

Comment by pseudohadamard

3 days ago

I always build with -Wall so I'm used to seeing the warning:

  > clang -Wall test.c
  test.c:4:16: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
      4 |         return i;
        |                ^
  test.c:3:14: note: initialize the variable 'i' to silence this warning
      3 |         int i;
        |              ^
        |               = 0
  1 warning generated.

For the oldest compiler I have access to, VC++ 6.0 from 1998:

  warning C4700: uninitialized local variable 'i' used

The trouble with warnings is every compiler has a different set of warnings. It balkanizes the language. Many D features are the result of cherry picking warnings from various compilers and making them standard features.

  • > It balkanizes the language.

    Not really, as C has had even more diverse implementations per-standardization. I would say the situation is now, much less diverse under the rule of GCC and Clang. (Yeah MSVC also exists.)

    • Every switch that changes the language semantics creates a separate language. If you have n such switches, your compiler is supporting n x n languages. I've also had troubles writing portable C code with all warnings enabled as different compilers contradicted each other on what was acceptable.

      I tried pretty hard to make D a warning-less language, but still some crept in grump grump.

      Have fun with this one:

          for (int i = 0; i < end; ++i);
              foo(i);
      

      One of the best programmers I know came up to me with this loop and told me my C compiler was broken because the loop was only executed once. I pointed at the ; and you can guess the rest.

      I added a warning for that in the C compiler, and for D simply disallowed it. I've noticed that some C compilers have since added a warning for that as well. The C folks should just make it illegal.

      I've also fixed printf in D so that:

          char* p;
          printf("%d\n", p);
      

      gives an error message, and the right format to use for `p`. It was a little thing, but it sure found a lot of incorrect formats in my code.

      5 replies →