Chybovník – chyba P310
Nadužívání globálních proměnných
Popis chyby: Chyba spočívá v tom, že se v programu zbytečně užívají globální proměnné (zejména v roli stavových proměnných), které jsou deklarované mimo těla funkcí, a to i tehdy, kdy by se tomu dalo snadno zabránit předáváním lokálních proměnných jako argumentů funkcím, které s nimi potřebují pracovat.Proč je to špatně? Globální proměnná nemá nijak omezený lexikální rozsah platnosti – jinými slovy je viditelná (a tedy i modifikovatelná kdekoliv, v celém programu). Funkce ji mohou libovolně měnit, a tím měnit také stav celého programu (protože globální proměnná je obvykle užita právě jako stavová proměnná). Když není taková proměnná předávána funkcím jako jejich argument, není zřejmé, která z funkcí ji případně modifikuje, a dá se tedy říci, že programátor ztrácí nad konzistencí hodnoty, uložené v takové proměnné veškerou kontrolu.
Ukázka problematického kódu:
1 : #include <stdio.h>
2 :
3 : int num_steps = 100;
4 :
5 : void run() {
6 : int i;
7 :
8 : for (i = 0; i < num_steps; i++) {
9 : /* zde se provádí nějaký výpočet */
10 : }
11 : }
12 :
13 : int main() {
14 : run();
15 : }
2 :
3 : int num_steps = 100;
4 :
5 : void run() {
6 : int i;
7 :
8 : for (i = 0; i < num_steps; i++) {
9 : /* zde se provádí nějaký výpočet */
10 : }
11 : }
12 :
13 : int main() {
14 : run();
15 : }
Ukázka správného kódu:
1 : #include <stdio.h>
2 :
3 : void run(int num_steps) {
4 : int i;
5 :
6 : for (i = 0; i < num_steps; i++) {
7 : /* zde se provádí nějaký výpočet */
8 : }
9 : }
10 :
11 : int main() {
12 : int steps = 100;
13 :
14 : run(steps);
15 : }
2 :
3 : void run(int num_steps) {
4 : int i;
5 :
6 : for (i = 0; i < num_steps; i++) {
7 : /* zde se provádí nějaký výpočet */
8 : }
9 : }
10 :
11 : int main() {
12 : int steps = 100;
13 :
14 : run(steps);
15 : }