views:

472

answers:

10

I had a nasty typo that wasted my time and my colleague's time, it was something like this:

for (i = 0; i < blah; i++); // <- I had a semi-colon here, that's the bug!
{
  // Some awesome logic here
}

First of all, it's very embarrassing, second thing, I should never repeat this. I'm relatively new to C. In Java, I guess I can use FindBugs to catch errors like these, what tool should I use for C code? Lint?

+14  A: 

Yes, PC-Lint is probably the best tool available.

arul
But be ready for a *lot* of warnings if the codebase is any kind of size and hasn't been linted already.
Michael Burr
True about a lot of warnings - but they are all configurable individually. So you can turn off anything you need to.
Steve Fallows
I find PC-lint's warnings to be cryptic and unclear at best.
Anthony Cuozzo
+4  A: 

I would start by learning about splint and gdb. If you need more advanced, build on these two tools. But they are a good start.

Thomas Owens
+6  A: 

In addition to Lykathea's PC-Lint suggestion, you can also get better (or at least more) diagnostics if you bump up the warning level of the compiler. Something like /W4 or -Wall

Though I'm not sure if your particular problem would have been caught with this (MS VC doesn't seem to flag it even with all warnings enabled). I think that's because it's not an uncommon idiom for for loops to be empty when the work is done as side effects of the loop control expressions.

Michael Burr
A: 

Any good GUI programming environment ("IDE" - Integrated Development Environment) like Eclipse would generate a warning in a case like that.

Richard T
+4  A: 

A few things that have saved me in the past, from the top of my head:

  • Use if (3 == bla) rather than (bla == 3), because if you misspell and type (3 = bla) the compiler will complain.

  • Use the all-warnings switch. Your compiler should warn you about empty statements like that.

  • Use assertions when you can and program defensively. Put good effort into making your program fail early, you will see the weaknesses that way.

  • Don't try to circumvent any safeguards the compiler or the OS have put in place. They are there for your ease of programming aswell.

mstrobl
A: 

In this (old) version of How to Shoot Yourself In the Foot, and in many other versions around the web, C is always the language that allows for the simplest procedure. When programming in C, you have to remember this and be careful. If you want protection, choose another language.

This saying is attributed to Bjarne Stroustrup (C++) himself. To (mis)quote:

"C makes it easy to shoot yourself in the foot"

gimel
the quote i heard was "C makes it easy to shoot yourself in the foot, but with C++ it blows your whole leg off"
Steven A. Lowe
Steven A. Lowe, you're correct - see the Stroustrup link. That is why I wrote "(mis)quote".
gimel
A: 

A good syntax highlighter will make some cases like this more visible.

wnoise
Or a reformatter like GNU indent.
reinierpost
+2  A: 

GCC has most of the functionality that Lint has had built in via the warning flags.

Andy Lester
A: 

I would suggest seeing if you have the ability to enforce MISRA standards. They were written with great thought and many rules that are simple for a compiler to check. For example, A rule I use requires all NOP commands have their own line. This means when you put a ; on the end of a loop statement it will through an error saying that it is not on it's own line.

Kortuk
A: 

Also look at clang static analysis

arsenm