Skip to content

Commit b8e6632

Browse files
authored
Merge pull request github#16140 from MathiasVP/alias-model-for-fopen
C++: Add alias models for `fopen` and friends
2 parents dfe2f1a + 557555e commit b8e6632

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

cpp/ql/lib/semmle/code/cpp/models/Models.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ private import implementations.SqLite3
4141
private import implementations.PostgreSql
4242
private import implementations.System
4343
private import implementations.StructuredExceptionHandling
44+
private import implementations.Fopen
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Provides implementation classes modeling `fopen` and various similar
3+
* functions. See `semmle.code.cpp.models.Models` for usage information.
4+
*/
5+
6+
import semmle.code.cpp.models.interfaces.Alias
7+
import semmle.code.cpp.models.interfaces.SideEffect
8+
9+
/** The function `fopen` and friends. */
10+
private class Fopen extends Function, AliasFunction, SideEffectFunction {
11+
Fopen() {
12+
this.hasGlobalOrStdName(["fopen", "fopen_s", "freopen"])
13+
or
14+
this.hasGlobalName(["_open", "_wfopen", "_fsopen", "_wfsopen", "_wopen"])
15+
}
16+
17+
override predicate hasOnlySpecificWriteSideEffects() { any() }
18+
19+
override predicate hasOnlySpecificReadSideEffects() { any() }
20+
21+
override predicate parameterEscapesOnlyViaReturn(int i) { none() }
22+
23+
override predicate parameterNeverEscapes(int index) {
24+
// None of the parameters escape
25+
this.getParameter(index).getUnspecifiedType() instanceof PointerType
26+
}
27+
28+
override predicate hasSpecificReadSideEffect(ParameterIndex i, boolean buffer) {
29+
(
30+
this.hasGlobalOrStdName(["fopen", "fopen_s"])
31+
or
32+
this.hasGlobalName(["_wfopen", "_fsopen", "_wfsopen"])
33+
) and
34+
i = [0, 1] and
35+
buffer = true
36+
or
37+
this.hasGlobalOrStdName("freopen") and
38+
(
39+
i = [0, 1] and
40+
buffer = true
41+
or
42+
i = 2 and
43+
buffer = false
44+
)
45+
or
46+
this.hasGlobalName(["_open", "_wopen"]) and
47+
i = 0 and
48+
buffer = true
49+
}
50+
}

0 commit comments

Comments
 (0)