Lably
Skip to content

Control flow

How software progresses through its implementation

  • 33 min read
  • 2 chapters
  • 1 lab on Lably

Learn it on Lably

Although an imperative language encodes control flow explicitly, languages of other programming paradigms are less focused on control flow. A declarative language specifies desired results without prescribing an order of operations. A functional language uses both language constructs and functions to control flow even though they are usually not called control flow statements.

For a central processing unit instruction set, a control flow instruction often alters the program counter and is either an unconditional branch (a.k.a. jump) or a conditional branch. An alternative approach is predication which conditionally enables instructions instead of branching.

An asynchronous control flow transfer such as an interrupt or a signal alters the normal flow of control to a handler before returning control to where it was interrupted.

One way to attack software is to redirect the flow of execution. A variety of control-flow integrity techniques, including stack canaries, buffer overflow protection, shadow stacks, and vtable pointer verification, are used to defend against these attacks.

Structure

Control flow is closely related to code structure. Control flows along lines defined by structure and the execution rules of a language. This general concept of structure is not be confused with structured programming which limits structure to sequencing, selection and iteration based on block organization.

Sequences

Sequential execution is the most basic structure. Although not all code is sequential in nature, imperative code is.

Labels

A label identifies a position in source code. Some control flow statements reference a label so that control jumps to the labeled line. Other than marking a position, a label has no other effect.

Some languages limit a label to a number which is sometimes called a line number, although that implies the inherent index of the line, not a label. None-the-less, such numeric labels are typically required to increment from top to bottom in a file even if not be sequential. For example, in BASIC:

<span id="mwRA"></span><span class="nl" id="mwRQ">10</span><span class="w" id="mwRg"> </span><span class="kd" id="mwRw">LET</span><span class="w" id="mwSA"> </span><span class="vg" id="mwSQ">X</span><span class="w" id="mwSg"> </span><span class="o" id="mwSw">=</span><span class="w" id="mwTA"> </span><span class="il" id="mwTQ">3</span> <span class="nl" id="mwTg">20</span><span class="w" id="mwTw"> </span><span class="kr" id="mwUA">PRINT</span><span class="w" id="mwUQ"> </span><span class="vg" id="mwUg">X</span> <span class="nl" id="mwUw">30</span><span class="w" id="mwVA"> </span><span class="kr" id="mwVQ">GOTO</span><span class="w" id="mwVg"> </span><span class="nl" id="mwVw">10</span>

In many languages, a label is an alphanumeric identifier, usually appearing at the start of a line and immediately followed by a colon. For example, the following C code defines a label Success on line 3 which identifies a jump target point at the first statement that follows it (line 4).

<span id="mwXQ"></span><span class="linenos" data-line="1" id="mwXg"></span><span class="kt" id="mwXw">void</span><span class="w" id="mwYA"> </span><span class="nf" id="mwYQ">f</span><span class="p" id="mwYg">(</span><span class="kt" id="mwYw">bool</span><span class="w" id="mwZA"> </span><span class="n" id="mwZQ">ok</span><span class="p" id="mwZg">)</span><span class="w" id="mwZw"> </span><span class="p" id="mwaA">{</span> <span class="linenos" data-line="2" id="mwaQ"></span><span class="w" id="mwag"> </span><span class="k" id="mwaw">if</span><span class="w" id="mwbA"> </span><span class="p" id="mwbQ">(</span><span class="n" id="mwbg">ok</span><span class="p" id="mwbw">)</span><span class="w" id="mwcA"> </span><span class="p" id="mwcQ">{</span> <span class="linenos" data-line="3" id="mwcg"></span><span class="w" id="mwcw"> </span><span class="k" id="mwdA">goto</span><span class="w" id="mwdQ"> </span><span class="n" id="mwdg">success</span><span class="p" id="mwdw">;</span> <span class="linenos" data-line="4" id="mweA"></span><span class="w" id="mweQ"> </span><span class="p" id="mweg">}</span> <span class="linenos" data-line="5" id="mwew"></span><span class="w" id="mwfA"> </span><span class="k" id="mwfQ">return</span><span class="p" id="mwfg">;</span> <span class="linenos" data-line="6" id="mwfw"></span><span class="nl" id="mwgA">success</span><span class="p" id="mwgQ">:</span> <span class="linenos" data-line="7" id="mwgg"></span><span class="w" id="mwgw"> </span><span class="n" id="mwhA">printf</span><span class="p" id="mwhQ">(</span><span class="s" id="mwhg">"OK"</span><span class="p" id="mwhw">);</span> <span class="linenos" data-line="8" id="mwiA"></span><span class="p" id="mwiQ">}</span>

Blocks

Most languages provide for organizing sequences of code as a block. When used with a control statement, the beginning of a block provides a jump target. For example, in the following C code (which uses curly braces to delimit a block), control jumps from line 1 to 4 if done is false.

<span id="mwjw"></span><span class="linenos" data-line="1" id="mwkA"></span><span class="k" id="mwkQ">if</span><span class="w" id="mwkg"> </span><span class="p" id="mwkw">(</span><span class="n" id="mwlA">done</span><span class="p" id="mwlQ">)</span><span class="w" id="mwlg"> </span><span class="p" id="mwlw">{</span> <span class="linenos" data-line="2" id="mwmA"></span><span class="w" id="mwmQ"> </span><span class="n" id="mwmg">printf</span><span class="p" id="mwmw">(</span><span class="s" id="mwnA">"All done"</span><span class="p" id="mwnQ">);</span> <span class="linenos" data-line="3" id="mwng"></span><span class="p" id="mwnw">}</span><span class="w" id="mwoA"> </span><span class="k" id="mwoQ">else</span><span class="w" id="mwog"> </span><span class="p" id="mwow">{</span> <span class="linenos" data-line="4" id="mwpA"></span><span class="w" id="mwpQ"> </span><span class="n" id="mwpg">printf</span><span class="p" id="mwpw">(</span><span class="s" id="mwqA">"Still workin' on it"</span><span class="p" id="mwqQ">);</span> <span class="linenos" data-line="5" id="mwqg"></span><span class="p" id="mwqw">}</span>

Sign in to keep reading

One more chapter is free with a Lably account.

More in Computing and communication