From: Jordan Rose Date: Tue, 9 Sep 2014 21:42:16 +0000 (+0000) Subject: Teach the analyzer that __builtin_assume_aligned returns its first argument. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c4ef1f5430bdc65a249c8d32acc1f0f07454558;p=clang Teach the analyzer that __builtin_assume_aligned returns its first argument. Patch by Daniel Fahlgren! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217461 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp b/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp index a871049848..104a81eac4 100644 --- a/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp @@ -42,8 +42,10 @@ bool BuiltinFunctionChecker::evalCall(const CallExpr *CE, return false; case Builtin::BI__builtin_expect: + case Builtin::BI__builtin_assume_aligned: case Builtin::BI__builtin_addressof: { - // For __builtin_expect, just return the value of the subexpression. + // For __builtin_expect and __builtin_assume_aligned, just return the value + // of the subexpression. // __builtin_addressof is going from a reference to a pointer, but those // are represented the same way in the analyzer. assert (CE->arg_begin() != CE->arg_end()); diff --git a/test/Analysis/builtin-functions.cpp b/test/Analysis/builtin-functions.cpp index 72d5ad23b1..d3afab5bd6 100644 --- a/test/Analysis/builtin-functions.cpp +++ b/test/Analysis/builtin-functions.cpp @@ -22,3 +22,31 @@ void testSize() { 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}} +}