Skip to content

Commit 562221f

Browse files
committed
False positive fix.
1 parent 031bd8b commit 562221f

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

cpp/ql/src/Security/CWE/CWE-704/WcharCharConversion.ql

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,31 @@ class WideCharPointerType extends PointerType {
1818
WideCharPointerType() { this.getBaseType() instanceof WideCharType }
1919
}
2020

21+
/**
22+
* types that may also be `CharPointerType`, but that are likely used as arbitrary buffers
23+
*/
24+
class UnlikelyToBeAStringType extends Type {
25+
UnlikelyToBeAStringType() {
26+
this.(PointerType).getBaseType().(CharType).isUnsigned() or
27+
this.(PointerType).getBaseType().getName().toLowerCase().matches("%byte") or
28+
this.getName().toLowerCase().matches("%byte") or
29+
this.(PointerType).getBaseType().hasName("uint8_t")
30+
}
31+
}
32+
2133
from Expr e1, Cast e2
2234
where
2335
e2 = e1.getConversion() and
2436
exists(WideCharPointerType w, CharPointerType c |
2537
w = e2.getUnspecifiedType().(PointerType) and
2638
c = e1.getUnspecifiedType().(PointerType)
27-
)
39+
) and
40+
// Avoid `BYTE`-like casting as they are typically false positives
41+
// Example: `BYTE* buffer;` ... `(wchar_t*) buffer;`
42+
not e1.getType() instanceof UnlikelyToBeAStringType and
43+
// Avoid castings from 'new' expressions as typically these will be safe
44+
// Example: `__Type* ret = reinterpret_cast<__Type*>(New(m_pmo) char[num * sizeof(__Type)]);`
45+
not exists(NewOrNewArrayExpr newExpr | newExpr.getAChild*() = e1)
2846
select e1,
2947
"Conversion from " + e1.getType().toString() + " to " + e2.getType().toString() +
3048
". Use of invalid string can lead to undefined behavior."

0 commit comments

Comments
 (0)