Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions cpp/ql/lib/change-notes/2025-03-31-calling-convention.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
category: feature
---
* Calling conventions explicitly specified on function declarations (`__cdecl`, `__stdcall`, `__fastcall`, etc.) are now represented as specifiers of those declarations.
* A new class `CallingConventionSpecifier` extending the `Specifier` class was introduced, which represents explicitly specified calling conventions.
12 changes: 12 additions & 0 deletions cpp/ql/lib/semmle/code/cpp/Specifier.qll
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ class AccessSpecifier extends Specifier {
override string getAPrimaryQlClass() { result = "AccessSpecifier" }
}

/**
* A C/C++ calling convention specifier: `cdecl`, `fastcall`, `stdcall`, `thiscall`,
* `vectorcall`, or `clrcall`.
*/
class CallingConventionSpecifier extends Specifier {
CallingConventionSpecifier() {
this.hasName(["cdecl", "fastcall", "stdcall", "thiscall", "vectorcall", "clrcall"])
}

override string getAPrimaryQlClass() { result = "CallingConventionSpecifier" }
}

/**
* An attribute introduced by GNU's `__attribute__((name))` syntax,
* Microsoft's `__declspec(name)` syntax, Microsoft's `[name]` syntax, the
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
| test.cpp:4:21:4:35 | definition of thiscall_method | thiscall |
| test.cpp:7:14:7:23 | definition of func_cdecl | cdecl |
| test.cpp:9:16:9:27 | definition of func_stdcall | stdcall |
| test.cpp:11:17:11:29 | definition of func_fastcall | fastcall |
| test.cpp:13:20:13:34 | definition of func_vectorcall | vectorcall |
| test.cpp:15:13:15:25 | definition of func_overload | cdecl |
| test.cpp:16:15:16:27 | definition of func_overload | stdcall |
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import cpp

from FunctionDeclarationEntry func, CallingConventionSpecifier ccs
where ccs.hasName(func.getASpecifier())
select func, func.getASpecifier()
16 changes: 16 additions & 0 deletions cpp/ql/test/library-tests/calling-convention/test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// semmle-extractor-options: --microsoft

struct call_conventions {
void __thiscall thiscall_method() {}
};

void __cdecl func_cdecl() {}

void __stdcall func_stdcall() {}

void __fastcall func_fastcall() {}

void __vectorcall func_vectorcall() {}

int __cdecl func_overload() {}
int __stdcall func_overload(int x) {}