diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/analysis.cpp | 3 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 20 | ||||
-rw-r--r-- | src/analysis/expression.h | 3 |
3 files changed, 26 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 494852c..f64c5c1 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -30,6 +30,7 @@ #include "nodes/decl/function_decl.h" #include "nodes/decl/var_decl.h" +#include "nodes/expr/addr_expr.h" #include "nodes/expr/modify_expr.h" #include "nodes/expr/pointerplus_expr.h" @@ -73,6 +74,8 @@ WalkItem analyseNode(Node *node, WalkItem wi) { case FUNCTION_DECL: return analyseFunction(static_cast<FunctionDeclNode*>(node), wi); + case ADDR_EXPR: + return analyseAddrExpr(static_cast<AddrExprNode*>(node), wi); case MODIFY_EXPR: return analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi); case POINTER_PLUS_EXPR: diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 81deae1..da59cd5 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -25,6 +25,7 @@ #include "analysis/analysis.h" #include "analysis/walkitem.h" +#include "nodes/expr/addr_expr.h" #include "nodes/expr/indirect_ref.h" #include "nodes/expr/modify_expr.h" #include "nodes/expr/pointerplus_expr.h" @@ -82,4 +83,23 @@ WalkItem analysePointerPlusExpr(PointerPlusExprNode *node, WalkItem wi) return wi; } +WalkItem analyseAddrExpr(AddrExprNode *node, WalkItem wi) +{ + // need atleast one arg for check + if (node->args.empty() || command == FindArgs) + return wi; + + Node *arg = node->args[0]; + if (arg->nodeType == PARM_DECL) + { + if (wi.checkNullVars.find(arg->label) != wi.checkNullVars.end()) + { + Log::warn(findBackLocation(node), + "Using variable without check for NULL"); + } + } + + return wi; +} + } diff --git a/src/analysis/expression.h b/src/analysis/expression.h index abba68b..5b222f1 100644 --- a/src/analysis/expression.h +++ b/src/analysis/expression.h @@ -22,6 +22,7 @@ #include "includes.h" +struct AddrExprNode; struct ModifyExprNode; struct PointerPlusExprNode; struct WalkItem; @@ -31,6 +32,8 @@ namespace Analysis WalkItem analyseModifyExpr(ModifyExprNode *node, WalkItem wi); WalkItem analysePointerPlusExpr(PointerPlusExprNode *node, WalkItem wi); + + WalkItem analyseAddrExpr(AddrExprNode *node, WalkItem wi); } #endif // ANALYSIS_EXPRESSION_H |