Hi,

This patch teaches the analyzer how the __builtin_assume_aligned()
function works. All it does is to return the first argument it gets.

Regards,
Daniel Fahlgren
Index: lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp	(revision 217428)
+++ lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp	(working copy)
@@ -75,6 +75,15 @@
     return true;
   }
 
+  case Builtin::BI__builtin_assume_aligned: {
+    // Return the first argument
+    if (CE->getNumArgs() < 1)
+      return false;
+    SVal X = state->getSVal(CE->getArg(0), LCtx);
+    C.addTransition(state->BindExpr(CE, LCtx, X));
+    return true;
+  }
+
   case Builtin::BI__builtin_object_size: {
     // This must be resolvable at compile time, so we defer to the constant
     // evaluator for a value.
Index: test/Analysis/builtin-functions.cpp
===================================================================
--- test/Analysis/builtin-functions.cpp	(revision 217428)
+++ test/Analysis/builtin-functions.cpp	(working copy)
@@ -22,3 +22,31 @@
 
   clang_analyzer_eval(i == 0); // expected-warning{{TRUE}}
 }
+
+void test_assume_aligned_1(char *p) {
+  char *q;
+
+  q = (char*) __builtin_assume_aligned(p, 16);
+  clang_analyzer_eval(p == q); // expected-warning{{TRUE}}
+}
+
+void test_assume_aligned_2(char *p) {
+  char *q;
+
+  q = (char*) __builtin_assume_aligned(p, 16, 8);
+  clang_analyzer_eval(p == q); // expected-warning{{TRUE}}
+}
+
+void test_assume_aligned_3(char *p) {
+  void *q;
+
+  q = __builtin_assume_aligned(p, 16, 8);
+  clang_analyzer_eval(p == q); // expected-warning{{TRUE}}
+}
+
+void test_assume_aligned_4(char *p) {
+  char *q;
+
+  q = (char*) __builtin_assume_aligned(p + 1, 16);
+  clang_analyzer_eval(p == q); // expected-warning{{FALSE}}
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to