The C compiler is liberal about the kinds of constructs it allows in programs. In keeping with the UNIX philosophy that “no news is good news” and that the user knows what is best, gcc, like many other GNU/Linux utilities, accepts almost anything that is logically possible according to the definition of the language. Although this approach gives the programmer a great deal of flexibility and control, it can make debugging difficult.
Figure 16-4 shows badtabs.c, a flawed version of the tabs.c program discussed earlier. It contains some errors and does not run properly but illustrates some debugging techniques.