Great new GCC option – Effective-C++ Warnings

Did you know about -Weffc++ in GCC? Neither did I, until I upgraded to new Code::Blocks from Jens’ unofficial Debian repository for Code::Blocks.

Here’s a few sample warnings, with sample lines and commentary:

  • /home/ivucica/Development/project/src/types.h|12|warning: ‘operator=’ should return a reference to ‘*this’|

Position &operator=(const Position& other) { x=other.x; y=other.y; z=other.z; return *this;}

What’s the big deal here? By leaving out the ampersand in this operator overloading, I accidentally returned a copy of entire Position class. (On the other hand, I had no reason to actually overload this operator so perhaps real fix is to erase entire line. Still…)

  • /home/ivucica/Development/project/src/mat.h|10|warning: ‘class Mat’ has pointer data members|
    /home/ivucica/Development/project/src/mat.h|10|warning: but does not override ‘Mat(const Mat&)’|
    /home/ivucica/Development/project/src/mat.h|10|warning: or ‘operator=(const Mat&)’|

No sample needed.

What’s the problem here? Well, we have a Mat class containing pointer. So what happens when someone does this: Mat x = y; or this: Mat x(y);? We have another instance of a class with copies of all the data, except the data pointed to by the pointer. Instead the pointer itself gets copied.

So if we keep a C-style string in there, we’re not really copying the string … we’re copying the pointer to it, and modifying the string in the new instance still modifies the string in the original ocpy.

While not applicable everywhere, still a good and useful warning.

  • /home/ivucica/Development/project/src/obj.h||In constructor ‘Obj::Obj()’:|
    /home/ivucica/Development/project/src/obj.h|15|warning: ‘Obj::m_radius’ should be initialized in the member initialization list|

Simple. Instead of initializing (or forgetting to initialize, or intentionally doing so) a variable in the constructor:
Obj() {m_classname=”Obj”; m_usecount = 0; }
why not do it in a “safe” and readable way (and perhaps more optimal?)
Obj() : m_classname(“Obj”), m_usecount(0) { }

While these warnings are certainly not the Universal Elixir to cure all your troubles, they will certainly prove useful in furthering your 1337 skills.


One thought on “Great new GCC option – Effective-C++ Warnings

  1. EmP

    I've read somewhere (Demystified C++ I think) that initialization list is generated to assign default values if it is not written explicitly. That mean if you set value to member in {} block, value will bee set twice. First time in initialization list (default value if it is not explicitly written otherwise) and second time in constructor body. So, initializing members in that list instead in constructor body results in less redundancy.


Leave a Reply

Your email address will not be published. Required fields are marked *

What is 9 + 14 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)

This site uses Akismet to reduce spam. Learn how your comment data is processed.