github: Update chunk_from_chars() CodeQL query to new data flow API

This commit is contained in:
Tobias Brunner
2024-12-11 15:17:37 +01:00
parent ddd1126e96
commit a465c54805
+10 -10
View File
@@ -10,8 +10,7 @@
* @precision very-high * @precision very-high
*/ */
import cpp import cpp
import DataFlow::PathGraph import semmle.code.cpp.dataflow.new.DataFlow
import semmle.code.cpp.dataflow.DataFlow
class ChunkFromChars extends Expr { class ChunkFromChars extends Expr {
ChunkFromChars() { ChunkFromChars() {
@@ -23,29 +22,30 @@ class ChunkFromChars extends Expr {
} }
} }
class ChunkFromCharsUsage extends DataFlow::Configuration { module ChunkFromCharsConfig implements DataFlow::ConfigSig {
ChunkFromCharsUsage() { this = "ChunkFromCharsUsage" } predicate isSource(DataFlow::Node source) {
override predicate isSource(DataFlow::Node source) {
source.asExpr() instanceof ChunkFromChars source.asExpr() instanceof ChunkFromChars
} }
override predicate isSink(DataFlow::Node sink) { predicate isSink(DataFlow::Node sink) {
exists(sink.asExpr()) exists(sink.asExpr())
} }
override predicate isBarrierOut(DataFlow::Node node) { predicate isBarrierOut(DataFlow::Node node) {
/* don't track beyond function calls */ /* don't track beyond function calls */
exists(FunctionCall fc | node.asExpr().getParent*() = fc) exists(FunctionCall fc | node.asExpr().getParent*() = fc)
} }
} }
module ChunkFromCharsFlow = DataFlow::Global<ChunkFromCharsConfig>;
import ChunkFromCharsFlow::PathGraph
BlockStmt enclosingBlock(BlockStmt b) { BlockStmt enclosingBlock(BlockStmt b) {
result = b.getEnclosingBlock() result = b.getEnclosingBlock()
} }
from ChunkFromCharsUsage usage, DataFlow::PathNode source, DataFlow::PathNode sink from ChunkFromCharsFlow::PathNode source, ChunkFromCharsFlow::PathNode sink
where where
usage.hasFlowPath(source, sink) ChunkFromCharsFlow::flowPath(source, sink)
and not source.getNode().asExpr().getEnclosingBlock() = enclosingBlock*(sink.getNode().asExpr().getEnclosingBlock()) and not source.getNode().asExpr().getEnclosingBlock() = enclosingBlock*(sink.getNode().asExpr().getEnclosingBlock())
select source, source, sink, "Invalid use of chunk_from_chars() result in sibling/parent block." select source, source, sink, "Invalid use of chunk_from_chars() result in sibling/parent block."