Merge pull request #12650 from gsingh93/strlen-literal-range-expr

C++: Add StrlenLiteralRangeExpr
This commit is contained in:
Mathias Vorreiter Pedersen
2023-03-24 16:58:16 +00:00
committed by GitHub
5 changed files with 33 additions and 0 deletions

View File

@@ -3,3 +3,4 @@ import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis
// Import each extension we want to enable
import extensions.SubtractSelf
import extensions.ConstantBitwiseAndExprRange
import extensions.StrlenLiteralRangeExpr

View File

@@ -0,0 +1,18 @@
private import cpp
private import experimental.semmle.code.cpp.models.interfaces.SimpleRangeAnalysisExpr
/**
* Provides range analysis information for calls to `strlen` on literal strings.
* For example, the range of `strlen("literal")` will be 7.
*/
class StrlenLiteralRangeExpr extends SimpleRangeAnalysisExpr, FunctionCall {
StrlenLiteralRangeExpr() {
getTarget().hasGlobalOrStdName("strlen") and getArgument(0).isConstant()
}
override int getLowerBounds() { result = getArgument(0).getValue().length() }
override int getUpperBounds() { result = getArgument(0).getValue().length() }
override predicate dependsOnChild(Expr e) { none() }
}

View File

@@ -0,0 +1,2 @@
| test.cpp:4:3:4:8 | call to strlen | 7.0 | 7.0 |
| test.cpp:5:3:5:8 | call to strlen | 1.8446744073709552E19 | 0.0 |

View File

@@ -0,0 +1,6 @@
import cpp
import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis
import experimental.semmle.code.cpp.rangeanalysis.extensions.StrlenLiteralRangeExpr
from FunctionCall fc
select fc, upperBound(fc), lowerBound(fc)

View File

@@ -0,0 +1,6 @@
unsigned long strlen(const char *);
void func(const char *s) {
strlen("literal");
strlen(s);
}