llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Isaac Nudelman (nuudlman) <details> <summary>Changes</summary> Prevent an assertion failure in the cstring checker when library functions like memcpy are defined with non-default address spaces. Adds a test for this case. --- Full diff: https://github.com/llvm/llvm-project/pull/153498.diff 2 Files Affected: - (modified) clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp (+3-3) - (modified) clang/test/Analysis/element-region-address-space.c (+16-1) ``````````diff diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 0e5fc0a074938..b16118e86c0c1 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -1129,9 +1129,9 @@ bool CStringChecker::isFirstBufInBound(CheckerContext &C, ProgramStateRef State, if (!ER) return true; // cf top comment. - // FIXME: Does this crash when a non-standard definition - // of a library function is encountered? - assert(ER->getValueType() == C.getASTContext().CharTy && + // Support library functions defined with non-default address spaces + assert(ER->getValueType().getCanonicalType().getUnqualifiedType() == + C.getASTContext().CharTy && "isFirstBufInBound should only be called with char* ElementRegions"); // Get the size of the array. diff --git a/clang/test/Analysis/element-region-address-space.c b/clang/test/Analysis/element-region-address-space.c index dd7066240fef6..6d657eeedca30 100644 --- a/clang/test/Analysis/element-region-address-space.c +++ b/clang/test/Analysis/element-region-address-space.c @@ -1,11 +1,26 @@ // RUN: %clang_analyze_cc1 -triple amdgcn-unknown-unknown \ -// RUN: -analyzer-checker=core -verify %s +// RUN: -analyzer-checker=core,unix -verify %s // expected-no-diagnostics // // By default, pointers are 64-bits. +#define ADDRESS_SPACE_64BITS __attribute__((address_space(0))) #define ADDRESS_SPACE_32BITS __attribute__((address_space(3))) int test(ADDRESS_SPACE_32BITS int *p, ADDRESS_SPACE_32BITS void *q) { return p == q; // no-crash } + +// Make sure that the cstring checker handles non-default address spaces +ADDRESS_SPACE_64BITS void * +memcpy(ADDRESS_SPACE_64BITS void *, + ADDRESS_SPACE_32BITS const void *, + long unsigned int); + +typedef struct { + char m[1]; +} k; + +void l(ADDRESS_SPACE_32BITS char *p, ADDRESS_SPACE_64BITS k *n) { + memcpy(&n->m[0], p, 4); +} \ No newline at end of file `````````` </details> https://github.com/llvm/llvm-project/pull/153498 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits