www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Some Clang warnings

A blog post that shows some of the warnings of the Clang compiler:


Below I copy from the blog post some of the most interesting of 
them, with quotations.


enum SortType {
     unknown = 0,
     min_invalid = 3,

     bubble = 1,

In this enum, a few non-valid values are defined, then the valid 
enums listed.  Valid enums use the auto increment to get their 
values.  However, min_invalid and insert both have value 3.  
Luckily, -Wduplicate-enum will identify enums in this situation 
and point them out. GCC will not warn on this.

D doesn't warn on this. Perhaps it's good to accept duplicated 
enum values only when the user adds some kind of annotation that 
denotes a desire for a duplicated value.


On to sort.cc

Class constructor:
Sort::Sort(int vec[], int size, bool sorted)
     : sorted_(sorted_), vec_(vec), size_(size) {

Members from sort.h:
     int* vec_;
     bool sorted_;
     int &size_;

Checking the only constructor of the class, numerous problems can 
be seen here. [...] sorted_ is initialized with itself instead of 
with sorted.  This leads to uninitialized value in sorted_, which 
is caught by the aptly named -Wuninitialized. For this case, GCC 
has -Wself-assign and -Wself-init.

In bugzilla I have asked for similar tests, like (that is closed):

Self-assignment is a common mistake that I'd like the D compiler 
to catch.


for (int i = 0; i < size_; ++i) {
   for (int j = 1; j < size_; ++i) {

This double nested loop gives bubble sort its n2 running time.  
Rather, in this case, an infinite running time.  Note the 
increment in both of the loops happen on i, even in the inner 
loop.  j is never touched, either here or inside the loop.  
-Wloop-analysis will give a warning when all the variables inside 
a for loop conditional does not change during the loop iteration. 
Only in Clang.

D has foreach that avoids this bug, but sometimes in D you have 
to use for loops (like when the increment is not 1)

void main() {
     enum size_ = 5;
     for (int i = 0; i < size_; i += 2) {
         for (int j = 1; j < size_; i += 2) {}


Sep 12 2013