Skip to content

Commit efa017f

Browse files
committed
Rule 21.2.3 - BannedSystemFunction.ql
Add a new query for detecting uses of the banned function `system`. [a]
1 parent d33b4eb commit efa017f

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* @id cpp/misra/banned-system-function
3+
* @name RULE-21-2-3: The library function system from <cstdlib> shall not be used
4+
* @description Using the system() function from cstdlib or stdlib.h causes undefined behavior and
5+
* potential security vulnerabilities.
6+
* @kind problem
7+
* @precision very-high
8+
* @problem.severity error
9+
* @tags external/misra/id/rule-21-2-3
10+
* scope/single-translation-unit
11+
* external/misra/enforcement/decidable
12+
* external/misra/obligation/required
13+
*/
14+
15+
import cpp
16+
import codingstandards.cpp.misra
17+
import codingstandards.cpp.BannedFunctions
18+
19+
class SystemFunction extends Function {
20+
SystemFunction() { this.hasGlobalName("system") or this.hasQualifiedName("std", "system") }
21+
}
22+
23+
from Element element, string message
24+
where
25+
not isExcluded(element, BannedAPIsPackage::bannedSystemFunctionQuery()) and
26+
(
27+
element instanceof BannedFunctions<SystemFunction>::Use and
28+
message =
29+
element.(BannedFunctions<SystemFunction>::Use).getAction() + " banned function '" +
30+
element.(BannedFunctions<SystemFunction>::Use).getFunctionName() + "'."
31+
or
32+
element instanceof MacroInvocation and
33+
element.(MacroInvocation).getMacroName() = "system" and
34+
message = "Use of banned macro 'system'."
35+
)
36+
select element, message
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
| test.cpp:4:3:4:13 | call to system | Call to banned function 'system'. |
2+
| test.cpp:8:14:8:24 | system | Address taken for banned function 'system'. |
3+
| test.cpp:9:29:9:39 | system | Address taken for banned function 'system'. |
4+
| test.cpp:13:40:13:50 | system | Address taken for banned function 'system'. |
5+
| test.cpp:17:3:17:13 | call to system | Call to banned function 'system'. |
6+
| test.cpp:22:3:22:13 | call to system | Call to banned function 'system'. |
7+
| test.cpp:35:3:35:8 | call to system | Call to banned function 'system'. |
8+
| test.cpp:39:29:39:34 | system | Address taken for banned function 'system'. |
9+
| test.cpp:44:3:44:21 | system(x) | Use of banned macro 'system'. |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rules/RULE-21-2-3/BannedSystemFunction.ql
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include <cstdlib>
2+
3+
void test_direct_call_to_system() {
4+
std::system("echo hello"); // NON_COMPLIANT
5+
}
6+
7+
void test_system_function_pointer() {
8+
auto l1 = &std::system; // NON_COMPLIANT
9+
int (*l2)(const char *) = std::system; // NON_COMPLIANT
10+
}
11+
12+
void test_system_address_taken() {
13+
void *l1 = reinterpret_cast<void *>(&std::system); // NON_COMPLIANT
14+
}
15+
16+
void test_system_call_with_null() {
17+
std::system(nullptr); // NON_COMPLIANT
18+
}
19+
20+
void test_system_call_with_variable() {
21+
const char *l1 = "ls";
22+
std::system(l1); // NON_COMPLIANT
23+
}
24+
25+
void test_compliant_alternative() {
26+
// Using compliant alternatives instead of system()
27+
const char *l1 = "some command"; // COMPLIANT
28+
// Implementation-specific alternatives would be used here
29+
}
30+
31+
// Test with C-style header (rule also applies to <stdlib.h>)
32+
#include <stdlib.h>
33+
34+
void test_c_style_header_system() {
35+
system("echo hello"); // NON_COMPLIANT
36+
}
37+
38+
void test_c_style_header_function_pointer() {
39+
int (*l1)(const char *) = system; // NON_COMPLIANT
40+
}
41+
42+
#define system(x) 0
43+
void test_system_macro_expansion() {
44+
system("echo test"); // NON_COMPLIANT
45+
}

0 commit comments

Comments
 (0)