r339641 - [CStringSyntaxChecker] Check strlcat sizeof check
Author: devnexen Date: Mon Aug 13 22:12:53 2018 New Revision: 339641 URL: http://llvm.org/viewvc/llvm-project?rev=339641&view=rev Log: [CStringSyntaxChecker] Check strlcat sizeof check - Assuming strlcat is used with strlcpy we check as we can if the last argument does not equal os not larger than the buffer. - Advising the proper usual pattern. Reviewers: NoQ, george.karpenkov Reviewed By: george.karpenkov Differential Revision: https://reviews.llvm.org/D49722 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=339641&r1=339640&r2=339641&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Mon Aug 13 22:12:53 2018 @@ -90,7 +90,16 @@ class WalkAST: public StmtVisitorgetNumArgs() != 3) return false; + const FunctionDecl *FD = CE->getDirectCallee(); + bool Append = CheckerContext::isCLibraryFunction(FD, "strlcat"); const Expr *DstArg = CE->getArg(0); const Expr *LenArg = CE->getArg(2); const auto *DstArgDecl = dyn_cast(DstArg->IgnoreParenImpCasts()); const auto *LenArgDecl = dyn_cast(LenArg->IgnoreParenLValueCasts()); uint64_t DstOff = 0; + // - sizeof(dst) + // strlcat appends at most size - strlen(dst) - 1 + if (Append && isSizeof(LenArg, DstArg)) +return true; // - size_t dstlen = sizeof(dst) if (LenArgDecl) { const auto *LenArgVal = dyn_cast(LenArgDecl->getDecl()); @@ -181,7 +196,10 @@ bool WalkAST::containsBadStrlcpyPattern( if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { ASTContext &C = BR.getContext(); uint64_t BufferLen = C.getTypeSize(Buffer) / 8; -if ((BufferLen - DstOff) < ILRawVal) +auto RemainingBufferLen = BufferLen - DstOff; +if (Append) + RemainingBufferLen -= 1; +if (RemainingBufferLen < ILRawVal) return true; } } @@ -220,7 +238,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE LenArg->getSourceRange()); } } else if (CheckerContext::isCLibraryFunction(FD, "strlcpy")) { -if (containsBadStrlcpyPattern(CE)) { +if (containsBadStrlcpyStrlcatPattern(CE)) { const Expr *DstArg = CE->getArg(0); const Expr *LenArg = CE->getArg(2); PathDiagnosticLocation Loc = @@ -236,6 +254,34 @@ void WalkAST::VisitCallExpr(CallExpr *CE BR.EmitBasicReport(FD, Checker, "Anti-pattern in the argument", "C String API", os.str(), Loc, + LenArg->getSourceRange()); +} + } else if (CheckerContext::isCLibraryFunction(FD, "strlcat")) { +if (containsBadStrlcpyStrlcatPattern(CE)) { + const Expr *DstArg = CE->getArg(0); + const Expr *LenArg = CE->getArg(2); + PathDiagnosticLocation Loc = +PathDiagnosticLocation::createBegin(LenArg, BR.getSourceManager(), AC); + + StringRef DstName = getPrintableName(DstArg); + StringRef LenName = getPrintableName(LenArg); + + SmallString<256> S; + llvm::raw_svector_ostream os(S); + os << "The third argument allows to potentially copy more bytes than it should. "; + os << "Replace with the value "; + if (!LenName.empty()) +os << "'" << LenName << "'"; + else +os << " "; + if (!DstName.empty()) +os << " - strlen(" << DstName << ")"; + else +os << " - strlen()"; + os << " - 1 or lower"; + + BR.EmitBasicReport(FD, Checker, "Anti-pattern in the argument", + "C String API", os.str(), Loc, LenArg->getSourceRange()); } } Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=339641&r1=339640&r2=339641&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Mon Aug 13 22:12:53 2018 @@ -7,6 +7,7 @@ typedef __SIZE_TYPE__ size_t; char *strncat(char *, const char *, size_t); size_t strlen (const char *s); size_t strlcpy(char *, const char *, size_t); +size_t strlcat(char *, const char *, size_t); void testStrncat(const char *src) { char dest[10]; @@ -33,3 +34,19 @@ void testStrlcpy(const char *src) { strlcpy(dest + 5, src, 5); strlcpy(dest + 5, src, 10); // expected-warning {{The third argument is larger than the size of the input buffer.}} } + +void testStrlcat(const char *src) { + char dest[10]; + size_t badlen = 10; + size_t ulen; + strlcpy(dest, "a", sizeof("a") - 1); + strlcat(dest, "bb
r339808 - [CStringSyntaxChecker] Reduces space around error message for strlcat.
Author: devnexen Date: Wed Aug 15 13:09:52 2018 New Revision: 339808 URL: http://llvm.org/viewvc/llvm-project?rev=339808&view=rev Log: [CStringSyntaxChecker] Reduces space around error message for strlcat. Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=339808&r1=339807&r2=339808&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Wed Aug 15 13:09:52 2018 @@ -273,7 +273,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE if (!LenName.empty()) os << "'" << LenName << "'"; else -os << " "; +os << ""; if (!DstName.empty()) os << " - strlen(" << DstName << ")"; else Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=339808&r1=339807&r2=339808&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Wed Aug 15 13:09:52 2018 @@ -42,7 +42,7 @@ void testStrlcat(const char *src) { strlcpy(dest, "a", sizeof("a") - 1); strlcat(dest, "", (sizeof("") - 1) - sizeof(dest) - 1); strlcpy(dest, "012345678", sizeof(dest)); - strlcat(dest, "910", sizeof(dest)); // expected-warning {{The third argument allows to potentially copy more bytes than it should. Replace with the value - strlen(dest) - 1 or lower}} + strlcat(dest, "910", sizeof(dest)); // expected-warning {{The third argument allows to potentially copy more bytes than it should. Replace with the value - strlen(dest) - 1 or lower}} strlcpy(dest, "0123456789", sizeof(dest)); strlcat(dest, "0123456789", badlen); // expected-warning {{The third argument allows to potentially copy more bytes than it should. Replace with the value 'badlen' - strlen(dest) - 1 or lower}} strlcat(dest, "0123456789", badlen - strlen(dest) - 1); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r333060 - [analyzer] CStringChecker fix for strlcpy when no bytes are copied to the dest buffer
Author: devnexen Date: Tue May 22 21:38:25 2018 New Revision: 333060 URL: http://llvm.org/viewvc/llvm-project?rev=333060&view=rev Log: [analyzer] CStringChecker fix for strlcpy when no bytes are copied to the dest buffer Again, strlc* does not return a pointer so the zero size case doest not fit. Reviewers: NoQ, george.karpenkov Reviewed by: NoQ Differential Revision: https://reviews.llvm.org/D47007 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp cfe/trunk/test/Analysis/bsd-string.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp?rev=333060&r1=333059&r2=333060&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp Tue May 22 21:38:25 2018 @@ -1652,7 +1652,11 @@ void CStringChecker::evalStrcpyCommon(Ch // If the size is known to be zero, we're done. if (StateZeroSize && !StateNonZeroSize) { - StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, DstVal); + if (returnPtr) { +StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, DstVal); + } else { +StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, *lenValNL); + } C.addTransition(StateZeroSize); return; } Modified: cfe/trunk/test/Analysis/bsd-string.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/bsd-string.c?rev=333060&r1=333059&r2=333060&view=diff == --- cfe/trunk/test/Analysis/bsd-string.c (original) +++ cfe/trunk/test/Analysis/bsd-string.c Tue May 22 21:38:25 2018 @@ -38,3 +38,8 @@ void f6() { size_t len = strlcat(buf, "defg", 4); clang_analyzer_eval(len == 7); // expected-warning{{TRUE}} } + +int f7() { + char buf[8]; + return strlcpy(buf, "1234567", 0); // no-crash +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r333059 - This is a test commit.
Author: devnexen Date: Tue May 22 21:27:39 2018 New Revision: 333059 URL: http://llvm.org/viewvc/llvm-project?rev=333059&view=rev Log: This is a test commit. Modified: cfe/trunk/examples/PrintFunctionNames/CMakeLists.txt Modified: cfe/trunk/examples/PrintFunctionNames/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/PrintFunctionNames/CMakeLists.txt?rev=333059&r1=333058&r2=333059&view=diff == --- cfe/trunk/examples/PrintFunctionNames/CMakeLists.txt (original) +++ cfe/trunk/examples/PrintFunctionNames/CMakeLists.txt Tue May 22 21:27:39 2018 @@ -1,6 +1,6 @@ # If we don't need RTTI or EH, there's no reason to export anything # from the plugin. -if( NOT MSVC ) # MSVC mangles symbols differently, and +if( NOT MSVC ) # MSVC mangles symbols differently, and # PrintFunctionNames.export contains C++ symbols. if( NOT LLVM_REQUIRES_RTTI ) if( NOT LLVM_REQUIRES_EH ) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r340712 - [Xray] Darwin - Enable in the driver side
Author: devnexen Date: Sun Aug 26 22:16:09 2018 New Revision: 340712 URL: http://llvm.org/viewvc/llvm-project?rev=340712&view=rev Log: [Xray] Darwin - Enable in the driver side Reviewers: dberris Reviered By: dberris Differential Revision: https://reviews.llvm.org/D51269 Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp cfe/trunk/lib/Driver/ToolChains/Darwin.h cfe/trunk/lib/Driver/XRayArgs.cpp cfe/trunk/test/Driver/XRay/lit.local.cfg cfe/trunk/test/Driver/XRay/xray-instrument-os.c Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.cpp?rev=340712&r1=340711&r2=340712&view=diff == --- cfe/trunk/lib/Driver/ToolChains/Darwin.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Darwin.cpp Sun Aug 26 22:16:09 2018 @@ -1105,6 +1105,13 @@ void DarwinClang::AddLinkRuntimeLibArgs( if (Sanitize.needsEsanRt()) AddLinkSanitizerLibArgs(Args, CmdArgs, "esan"); + const XRayArgs &XRay = getXRayArgs(); + if (XRay.needsXRayRt()) { +AddLinkRuntimeLib(Args, CmdArgs, "xray"); +AddLinkRuntimeLib(Args, CmdArgs, "xray-basic"); +AddLinkRuntimeLib(Args, CmdArgs, "xray-fdr"); + } + // Otherwise link libSystem, then the dynamic runtime library, and finally any // target specific static runtime library. CmdArgs.push_back("-lSystem"); Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.h?rev=340712&r1=340711&r2=340712&view=diff == --- cfe/trunk/lib/Driver/ToolChains/Darwin.h (original) +++ cfe/trunk/lib/Driver/ToolChains/Darwin.h Sun Aug 26 22:16:09 2018 @@ -11,6 +11,7 @@ #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H #include "Cuda.h" +#include "clang/Driver/XRayArgs.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" Modified: cfe/trunk/lib/Driver/XRayArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/XRayArgs.cpp?rev=340712&r1=340711&r2=340712&view=diff == --- cfe/trunk/lib/Driver/XRayArgs.cpp (original) +++ cfe/trunk/lib/Driver/XRayArgs.cpp Sun Aug 26 22:16:09 2018 @@ -52,7 +52,8 @@ XRayArgs::XRayArgs(const ToolChain &TC, } } else if (Triple.getOS() == llvm::Triple::FreeBSD || Triple.getOS() == llvm::Triple::OpenBSD || - Triple.getOS() == llvm::Triple::NetBSD) { + Triple.getOS() == llvm::Triple::NetBSD || + Triple.getOS() == llvm::Triple::Darwin) { if (Triple.getArch() != llvm::Triple::x86_64) { D.Diag(diag::err_drv_clang_unsupported) << (std::string(XRayInstrumentOption) + " on " + Triple.str()); Modified: cfe/trunk/test/Driver/XRay/lit.local.cfg URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/XRay/lit.local.cfg?rev=340712&r1=340711&r2=340712&view=diff == --- cfe/trunk/test/Driver/XRay/lit.local.cfg (original) +++ cfe/trunk/test/Driver/XRay/lit.local.cfg Sun Aug 26 22:16:09 2018 @@ -10,7 +10,7 @@ supported_targets = [ # Only on platforms we support. supported_oses = [ -'Linux', 'FreeBSD' +'Linux', 'FreeBSD', 'Darwin' ] triple_set = set(target_triple_components) Modified: cfe/trunk/test/Driver/XRay/xray-instrument-os.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/XRay/xray-instrument-os.c?rev=340712&r1=340711&r2=340712&view=diff == --- cfe/trunk/test/Driver/XRay/xray-instrument-os.c (original) +++ cfe/trunk/test/Driver/XRay/xray-instrument-os.c Sun Aug 26 22:16:09 2018 @@ -1,4 +1,4 @@ // RUN: not %clang -o /dev/null -v -fxray-instrument -c %s -// XFAIL: -linux-, -freebsd +// XFAIL: -linux-, -freebsd, -darwin // REQUIRES-ANY: amd64, x86_64, x86_64h, arm, aarch64, arm64 typedef int a; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r337499 - [CStringSyntaxChecker] Check strlcpy sizeof syntax
Author: devnexen Date: Thu Jul 19 14:50:03 2018 New Revision: 337499 URL: http://llvm.org/viewvc/llvm-project?rev=337499&view=rev Log: [CStringSyntaxChecker] Check strlcpy sizeof syntax The last argument is expected to be the destination buffer size (or less). Detects if it points to destination buffer size directly or via a variable. Detects if it is an integral, try to detect if the destination buffer can receive the source length. Updating bsd-string.c unit tests as it make it fails now. Reviewers: george.karpenpov, NoQ Reviewed By: george.karpenkov Differential Revision: https://reviews.llvm.org/D48884 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/bsd-string.c cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=337499&r1=337498&r2=337499&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Thu Jul 19 14:50:03 2018 @@ -80,6 +80,17 @@ class WalkAST: public StmtVisitorgetNumArgs() != 3) +return false; + const Expr *DstArg = CE->getArg(0); + const Expr *LenArg = CE->getArg(2); + + const auto *DstArgDecl = dyn_cast(DstArg->IgnoreParenCasts()); + const auto *LenArgDecl = dyn_cast(LenArg->IgnoreParenLValueCasts()); + // - size_t dstlen = sizeof(dst) + if (LenArgDecl) { +const auto *LenArgVal = dyn_cast(LenArgDecl->getDecl()); +if (LenArgVal->getInit()) + LenArg = LenArgVal->getInit(); + } + + // - integral value + // We try to figure out if the last argument is possibly longer + // than the destination can possibly handle if its size can be defined + if (const auto *IL = dyn_cast(LenArg->IgnoreParenCasts())) { +uint64_t ILRawVal = IL->getValue().getZExtValue(); +if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { + ASTContext &C = BR.getContext(); + uint64_t Usize = C.getTypeSizeInChars(DstArg->getType()).getQuantity(); + uint64_t BufferLen = BR.getContext().getTypeSize(Buffer) / Usize; + if (BufferLen < ILRawVal) +return true; +} + } + + return false; +} + void WalkAST::VisitCallExpr(CallExpr *CE) { const FunctionDecl *FD = CE->getDirectCallee(); if (!FD) @@ -157,6 +200,25 @@ void WalkAST::VisitCallExpr(CallExpr *CE BR.EmitBasicReport(FD, Checker, "Anti-pattern in the argument", "C String API", os.str(), Loc, + LenArg->getSourceRange()); +} + } else if (CheckerContext::isCLibraryFunction(FD, "strlcpy")) { +if (containsBadStrlcpyPattern(CE)) { + const Expr *DstArg = CE->getArg(0); + const Expr *LenArg = CE->getArg(2); + PathDiagnosticLocation Loc = +PathDiagnosticLocation::createBegin(LenArg, BR.getSourceManager(), AC); + + StringRef DstName = getPrintableName(DstArg); + + SmallString<256> S; + llvm::raw_svector_ostream os(S); + os << "The third argument is larger than the size of the input buffer. "; + if (!DstName.empty()) +os << "Replace with the value 'sizeof(" << DstName << ")` or lower"; + + BR.EmitBasicReport(FD, Checker, "Anti-pattern in the argument", + "C String API", os.str(), Loc, LenArg->getSourceRange()); } } Modified: cfe/trunk/test/Analysis/bsd-string.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/bsd-string.c?rev=337499&r1=337498&r2=337499&view=diff == --- cfe/trunk/test/Analysis/bsd-string.c (original) +++ cfe/trunk/test/Analysis/bsd-string.c Thu Jul 19 14:50:03 2018 @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.cstring,alpha.unix.cstring,debug.ExprInspection -analyzer-store=region -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.cstring.NullArg,alpha.unix.cstring,debug.ExprInspection -analyzer-store=region -verify %s #define NULL ((void *)0) Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=337499&r1=337498&r2=337499&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Thu Jul 19 14:50:03 2018 @@ -3,6 +3,7 @@ typedef __SIZE_TYPE__ size_t; char *strncat(char *, const char *, size_t); size_t strlen (const char *s); +size_t strlcpy(char *, const char *, size_t); void testStrncat(const char *src) { char dest[10]; @@ -13,3 +14,17 @@ void testStrncat(const char *src) { // Should not crash when sizeof has a type arg
r337611 - [CStringSyntaxChecker] Fix build bot builds != x86 archs
Author: devnexen Date: Fri Jul 20 13:39:49 2018 New Revision: 337611 URL: http://llvm.org/viewvc/llvm-project?rev=337611&view=rev Log: [CStringSyntaxChecker] Fix build bot builds != x86 archs Reviewers: NoQ,george.karpenkov Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D49588 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=337611&r1=337610&r2=337611&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Fri Jul 20 13:39:49 2018 @@ -147,7 +147,7 @@ bool WalkAST::containsBadStrlcpyPattern( const Expr *DstArg = CE->getArg(0); const Expr *LenArg = CE->getArg(2); - const auto *DstArgDecl = dyn_cast(DstArg->IgnoreParenCasts()); + const auto *DstArgDecl = dyn_cast(DstArg->IgnoreParenImpCasts()); const auto *LenArgDecl = dyn_cast(LenArg->IgnoreParenLValueCasts()); // - size_t dstlen = sizeof(dst) if (LenArgDecl) { @@ -159,14 +159,15 @@ bool WalkAST::containsBadStrlcpyPattern( // - integral value // We try to figure out if the last argument is possibly longer // than the destination can possibly handle if its size can be defined - if (const auto *IL = dyn_cast(LenArg->IgnoreParenCasts())) { + if (const auto *IL = dyn_cast(LenArg->IgnoreParenImpCasts())) { uint64_t ILRawVal = IL->getValue().getZExtValue(); -if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { - ASTContext &C = BR.getContext(); - uint64_t Usize = C.getTypeSizeInChars(DstArg->getType()).getQuantity(); - uint64_t BufferLen = BR.getContext().getTypeSize(Buffer) / Usize; - if (BufferLen < ILRawVal) -return true; +if (DstArgDecl) { + if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { +ASTContext &C = BR.getContext(); +uint64_t BufferLen = C.getTypeSize(Buffer) / 8; +if (BufferLen < ILRawVal) + return true; + } } } Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=337611&r1=337610&r2=337611&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Fri Jul 20 13:39:49 2018 @@ -1,4 +1,7 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=unix.cstring.BadSizeArg -analyzer-store=region -Wno-strncat-size -Wno-strlcpy-strlcat-size -Wno-sizeof-array-argument -Wno-sizeof-pointer-memaccess -verify %s +// RUN: %clang_analyze_cc1 -triple armv7-a15-linux -analyzer-checker=unix.cstring.BadSizeArg -analyzer-store=region -Wno-strncat-size -Wno-strlcpy-strlcat-size -Wno-sizeof-array-argument -Wno-sizeof-pointer-memaccess -verify %s +// RUN: %clang_analyze_cc1 -triple aarch64_be-none-linux-gnu -analyzer-checker=unix.cstring.BadSizeArg -analyzer-store=region -Wno-strncat-size -Wno-strlcpy-strlcat-size -Wno-sizeof-array-argument -Wno-sizeof-pointer-memaccess -verify %s +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -analyzer-checker=unix.cstring.BadSizeArg -analyzer-store=region -Wno-strncat-size -Wno-strlcpy-strlcat-size -Wno-sizeof-array-argument -Wno-sizeof-pointer-memaccess -verify %s typedef __SIZE_TYPE__ size_t; char *strncat(char *, const char *, size_t); @@ -27,4 +30,5 @@ void testStrlcpy(const char *src) { strlcpy(dest, src, 20); // expected-warning {{The third argument is larger than the size of the input buffer. Replace with the value 'sizeof(dest)` or lower}} strlcpy(dest, src, badlen); // expected-warning {{The third argument is larger than the size of the input buffer. Replace with the value 'sizeof(dest)` or lower}} strlcpy(dest, src, ulen); + strlcpy(dest + 5, src, 5); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r337721 - [CStringSyntaxChecker] Improvements of strlcpy check
Author: devnexen Date: Mon Jul 23 11:26:38 2018 New Revision: 337721 URL: http://llvm.org/viewvc/llvm-project?rev=337721&view=rev Log: [CStringSyntaxChecker] Improvements of strlcpy check Adding an additional check whenwe offset fro the buffer base address. Reviewers: george.karpenkov,NoQ Reviewed By: george.karpenkov Differential Revision: https://reviews.llvm.org/D49633 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=337721&r1=337720&r2=337721&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Mon Jul 23 11:26:38 2018 @@ -88,6 +88,7 @@ class WalkAST: public StmtVisitor(DstArg->IgnoreParenImpCasts()); const auto *LenArgDecl = dyn_cast(LenArg->IgnoreParenLValueCasts()); + uint64_t DstOff = 0; // - size_t dstlen = sizeof(dst) if (LenArgDecl) { const auto *LenArgVal = dyn_cast(LenArgDecl->getDecl()); @@ -158,14 +160,28 @@ bool WalkAST::containsBadStrlcpyPattern( // - integral value // We try to figure out if the last argument is possibly longer - // than the destination can possibly handle if its size can be defined + // than the destination can possibly handle if its size can be defined. if (const auto *IL = dyn_cast(LenArg->IgnoreParenImpCasts())) { uint64_t ILRawVal = IL->getValue().getZExtValue(); + +// Case when there is pointer arithmetic on the destination buffer +// especially when we offset from the base decreasing the +// buffer length accordingly. +if (!DstArgDecl) { + if (const auto *BE = dyn_cast(DstArg->IgnoreParenImpCasts())) { +DstArgDecl = dyn_cast(BE->getLHS()->IgnoreParenImpCasts()); +if (BE->getOpcode() == BO_Add) { + if ((IL = dyn_cast(BE->getRHS()->IgnoreParenImpCasts( { +DstOff = IL->getValue().getZExtValue(); + } +} + } +} if (DstArgDecl) { if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { ASTContext &C = BR.getContext(); uint64_t BufferLen = C.getTypeSize(Buffer) / 8; -if (BufferLen < ILRawVal) +if ((BufferLen - DstOff) < ILRawVal) return true; } } Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=337721&r1=337720&r2=337721&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Mon Jul 23 11:26:38 2018 @@ -31,4 +31,5 @@ void testStrlcpy(const char *src) { strlcpy(dest, src, badlen); // expected-warning {{The third argument is larger than the size of the input buffer. Replace with the value 'sizeof(dest)` or lower}} strlcpy(dest, src, ulen); strlcpy(dest + 5, src, 5); + strlcpy(dest + 5, src, 10); // expected-warning {{The third argument is larger than the size of the input buffer.}} } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r337926 - [Docs] Update supported oses for safestack, ubsan, asan, tsan and msan
Author: devnexen Date: Wed Jul 25 06:55:06 2018 New Revision: 337926 URL: http://llvm.org/viewvc/llvm-project?rev=337926&view=rev Log: [Docs] Update supported oses for safestack, ubsan, asan, tsan and msan Adding oses others than Linux. Modified: cfe/trunk/docs/AddressSanitizer.rst cfe/trunk/docs/MemorySanitizer.rst cfe/trunk/docs/SafeStack.rst cfe/trunk/docs/ThreadSanitizer.rst cfe/trunk/docs/UndefinedBehaviorSanitizer.rst Modified: cfe/trunk/docs/AddressSanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/AddressSanitizer.rst?rev=337926&r1=337925&r2=337926&view=diff == --- cfe/trunk/docs/AddressSanitizer.rst (original) +++ cfe/trunk/docs/AddressSanitizer.rst Wed Jul 25 06:55:06 2018 @@ -276,6 +276,7 @@ AddressSanitizer is supported on: * OS X 10.7 - 10.11 (i386/x86\_64) * iOS Simulator * Android ARM +* NetBSD i386/x86\_64 * FreeBSD i386/x86\_64 (tested on FreeBSD 11-current) Ports to various other platforms are in progress. Modified: cfe/trunk/docs/MemorySanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/MemorySanitizer.rst?rev=337926&r1=337925&r2=337926&view=diff == --- cfe/trunk/docs/MemorySanitizer.rst (original) +++ cfe/trunk/docs/MemorySanitizer.rst Wed Jul 25 06:55:06 2018 @@ -185,7 +185,11 @@ self-built instrumented libc++ (as a rep Supported Platforms === -MemorySanitizer is supported on Linux x86\_64/MIPS64/AArch64. +MemorySanitizer is supported on the following OS: + +* Linux +* NetBSD +* FreeBSD Limitations === Modified: cfe/trunk/docs/SafeStack.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/SafeStack.rst?rev=337926&r1=337925&r2=337926&view=diff == --- cfe/trunk/docs/SafeStack.rst (original) +++ cfe/trunk/docs/SafeStack.rst Wed Jul 25 06:55:06 2018 @@ -126,7 +126,7 @@ and link command lines. Supported Platforms --- -SafeStack was tested on Linux, FreeBSD and MacOSX. +SafeStack was tested on Linux, NetBSD, FreeBSD and MacOSX. Low-level API - Modified: cfe/trunk/docs/ThreadSanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ThreadSanitizer.rst?rev=337926&r1=337925&r2=337926&view=diff == --- cfe/trunk/docs/ThreadSanitizer.rst (original) +++ cfe/trunk/docs/ThreadSanitizer.rst Wed Jul 25 06:55:06 2018 @@ -17,7 +17,11 @@ Build LLVM/Clang with `CMake
r337927 - Fix tsan doc
Author: devnexen Date: Wed Jul 25 07:27:14 2018 New Revision: 337927 URL: http://llvm.org/viewvc/llvm-project?rev=337927&view=rev Log: Fix tsan doc Modified: cfe/trunk/docs/ThreadSanitizer.rst Modified: cfe/trunk/docs/ThreadSanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ThreadSanitizer.rst?rev=337927&r1=337926&r2=337927&view=diff == --- cfe/trunk/docs/ThreadSanitizer.rst (original) +++ cfe/trunk/docs/ThreadSanitizer.rst Wed Jul 25 07:27:14 2018 @@ -22,6 +22,7 @@ ThreadSanitizer is supported on the foll * Linux * NetBSD * FreeBSD + Support for other 64-bit architectures is possible, contributions are welcome. Support for 32-bit platforms is problematic and is not planned. ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] r345700 - [clangd] fix non linux build
Author: devnexen Date: Wed Oct 31 02:04:15 2018 New Revision: 345700 URL: http://llvm.org/viewvc/llvm-project?rev=345700&view=rev Log: [clangd] fix non linux build There is no SCHED_IDLE semantic equivalent in BSD systems. Reviewers: kadircet, sammccall Revieweed By: sammccall Differential Revision: https://reviews.llvm.org/D53922 Modified: clang-tools-extra/trunk/clangd/Threading.cpp Modified: clang-tools-extra/trunk/clangd/Threading.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Threading.cpp?rev=345700&r1=345699&r2=345700&view=diff == --- clang-tools-extra/trunk/clangd/Threading.cpp (original) +++ clang-tools-extra/trunk/clangd/Threading.cpp Wed Oct 31 02:04:15 2018 @@ -102,7 +102,7 @@ void wait(std::unique_lock & } void setThreadPriority(std::thread &T, ThreadPriority Priority) { -#ifdef HAVE_PTHREAD_H +#if defined(HAVE_PTHREAD_H) && defined(__linux__) sched_param priority; priority.sched_priority = 0; pthread_setschedparam( ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] r352031 - [extra] unit tests enable crash-recovery cases on FreeBSD
Author: devnexen Date: Wed Jan 23 23:58:42 2019 New Revision: 352031 URL: http://llvm.org/viewvc/llvm-project?rev=352031&view=rev Log: [extra] unit tests enable crash-recovery cases on FreeBSD Seems the previous statement does not hold up anymore. Reviewers: steveire Reviewed By: steveire Differential Revision: https://reviews.llvm.org/D57102 Modified: clang-tools-extra/trunk/test/lit.cfg Modified: clang-tools-extra/trunk/test/lit.cfg URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/lit.cfg?rev=352031&r1=352030&r2=352031&view=diff == --- clang-tools-extra/trunk/test/lit.cfg (original) +++ clang-tools-extra/trunk/test/lit.cfg Wed Jan 23 23:58:42 2019 @@ -99,11 +99,9 @@ config.environment['LD_LIBRARY_PATH'] = if lit_config.useValgrind: config.target_triple += '-vg' +config.available_features.add('crash-recovery') # Set available features we allow tests to conditionalize on. # -# As of 2011.08, crash-recovery tests still do not pass on FreeBSD. -if platform.system() not in ['FreeBSD']: -config.available_features.add('crash-recovery') # Shell execution if execute_external: ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r348884 - [analyzer][CStringChecker] evaluate explicit_bzero
Author: devnexen Date: Tue Dec 11 10:57:07 2018 New Revision: 348884 URL: http://llvm.org/viewvc/llvm-project?rev=348884&view=rev Log: [analyzer][CStringChecker] evaluate explicit_bzero - explicit_bzero has limited scope/usage only for security/crypto purposes but is non-optimisable version of memset/0 and bzero. - explicit_memset has similar signature and semantics as memset but is also a non-optimisable version. Reviewers: NoQ Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D54592 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp cfe/trunk/test/Analysis/string.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp?rev=348884&r1=348883&r2=348884&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp Tue Dec 11 10:57:07 2018 @@ -124,6 +124,7 @@ public: void evalStdCopyBackward(CheckerContext &C, const CallExpr *CE) const; void evalStdCopyCommon(CheckerContext &C, const CallExpr *CE) const; void evalMemset(CheckerContext &C, const CallExpr *CE) const; + void evalBzero(CheckerContext &C, const CallExpr *CE) const; // Utility methods std::pair @@ -158,7 +159,7 @@ public: static bool SummarizeRegion(raw_ostream &os, ASTContext &Ctx, const MemRegion *MR); - static bool memsetAux(const Expr *DstBuffer, const Expr *CharE, + static bool memsetAux(const Expr *DstBuffer, SVal CharE, const Expr *Size, CheckerContext &C, ProgramStateRef &State); @@ -1005,11 +1006,10 @@ bool CStringChecker::SummarizeRegion(raw } } -bool CStringChecker::memsetAux(const Expr *DstBuffer, const Expr *CharE, +bool CStringChecker::memsetAux(const Expr *DstBuffer, SVal CharVal, const Expr *Size, CheckerContext &C, ProgramStateRef &State) { SVal MemVal = C.getSVal(DstBuffer); - SVal CharVal = C.getSVal(CharE); SVal SizeVal = C.getSVal(Size); const MemRegion *MR = MemVal.getAsRegion(); if (!MR) @@ -2184,13 +2184,59 @@ void CStringChecker::evalMemset(CheckerC // According to the values of the arguments, bind the value of the second // argument to the destination buffer and set string length, or just // invalidate the destination buffer. - if (!memsetAux(Mem, CharE, Size, C, State)) + if (!memsetAux(Mem, C.getSVal(CharE), Size, C, State)) return; State = State->BindExpr(CE, LCtx, MemVal); C.addTransition(State); } +void CStringChecker::evalBzero(CheckerContext &C, const CallExpr *CE) const { + if (CE->getNumArgs() != 2) +return; + + CurrentFunctionDescription = "memory clearance function"; + + const Expr *Mem = CE->getArg(0); + const Expr *Size = CE->getArg(1); + SVal Zero = C.getSValBuilder().makeZeroVal(C.getASTContext().IntTy); + + ProgramStateRef State = C.getState(); + + // See if the size argument is zero. + SVal SizeVal = C.getSVal(Size); + QualType SizeTy = Size->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = +assumeZero(C, State, SizeVal, SizeTy); + + // If the size is zero, there won't be any actual memory access, + // In this case we just return. + if (StateZeroSize && !StateNonZeroSize) { +C.addTransition(StateZeroSize); +return; + } + + // Get the value of the memory area. + SVal MemVal = C.getSVal(Mem); + + // Ensure the memory area is not null. + // If it is NULL there will be a NULL pointer dereference. + State = checkNonNull(C, StateNonZeroSize, Mem, MemVal); + if (!State) +return; + + State = CheckBufferAccess(C, State, Size, Mem); + if (!State) +return; + + if (!memsetAux(Mem, Zero, Size, C, State)) +return; + + C.addTransition(State); +} + static bool isCPPStdLibraryFunction(const FunctionDecl *FD, StringRef Name) { IdentifierInfo *II = FD->getIdentifier(); if (!II) @@ -2224,7 +2270,8 @@ bool CStringChecker::evalCall(const Call evalFunction = &CStringChecker::evalMemcmp; else if (C.isCLibraryFunction(FDecl, "memmove")) evalFunction = &CStringChecker::evalMemmove; - else if (C.isCLibraryFunction(FDecl, "memset")) + else if (C.isCLibraryFunction(FDecl, "memset") || +C.isCLibraryFunction(FDecl, "explicit_memset")) evalFunction = &CStringChecker::evalMemset; else if (C.isCLibraryFunction(FDecl, "strcpy")) evalFunction = &CStringChecker::evalStrcpy; @@ -2262,6 +2309,9 @@ bool CStringChecker::evalCall(const Call evalFunction = &CStringChecker::evalStdCopy; else if (isCPPStdLibraryFunction(FDecl, "copy_backward")) evalFunction = &CStringChecker::evalStdCopyBackward; + else if (C.isCLibraryFunction(FDecl, "bzero") || +
r342832 - [CStringSyntaxChecker] Check strlcat sizeof check
Author: devnexen Date: Sun Sep 23 01:30:17 2018 New Revision: 342832 URL: http://llvm.org/viewvc/llvm-project?rev=342832&view=rev Log: [CStringSyntaxChecker] Check strlcat sizeof check Assuming strlcat is used with strlcpy we check as we can if the last argument does not equal os not larger than the buffer. Advising the proper usual pattern. Reviewers: george.karpenkov, NoQ, MaskRay Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D49722 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp cfe/trunk/test/Analysis/cstring-syntax.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp?rev=342832&r1=342831&r2=342832&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringSyntaxChecker.cpp Sun Sep 23 01:30:17 2018 @@ -90,7 +90,16 @@ class WalkAST: public StmtVisitorgetNumArgs() != 3) return false; + const FunctionDecl *FD = CE->getDirectCallee(); + bool Append = CheckerContext::isCLibraryFunction(FD, "strlcat"); const Expr *DstArg = CE->getArg(0); const Expr *LenArg = CE->getArg(2); const auto *DstArgDecl = dyn_cast(DstArg->IgnoreParenImpCasts()); const auto *LenArgDecl = dyn_cast(LenArg->IgnoreParenLValueCasts()); uint64_t DstOff = 0; + if (isSizeof(LenArg, DstArg)) +return false; // - size_t dstlen = sizeof(dst) if (LenArgDecl) { const auto *LenArgVal = dyn_cast(LenArgDecl->getDecl()); @@ -181,8 +194,14 @@ bool WalkAST::containsBadStrlcpyPattern( if (const auto *Buffer = dyn_cast(DstArgDecl->getType())) { ASTContext &C = BR.getContext(); uint64_t BufferLen = C.getTypeSize(Buffer) / 8; -if ((BufferLen - DstOff) < ILRawVal) - return true; +auto RemainingBufferLen = BufferLen - DstOff; +if (Append) { + if (RemainingBufferLen <= ILRawVal) +return true; +} else { + if (RemainingBufferLen < ILRawVal) +return true; +} } } } @@ -219,8 +238,9 @@ void WalkAST::VisitCallExpr(CallExpr *CE "C String API", os.str(), Loc, LenArg->getSourceRange()); } - } else if (CheckerContext::isCLibraryFunction(FD, "strlcpy")) { -if (containsBadStrlcpyPattern(CE)) { + } else if (CheckerContext::isCLibraryFunction(FD, "strlcpy") || + CheckerContext::isCLibraryFunction(FD, "strlcat")) { +if (containsBadStrlcpyStrlcatPattern(CE)) { const Expr *DstArg = CE->getArg(0); const Expr *LenArg = CE->getArg(2); PathDiagnosticLocation Loc = @@ -230,13 +250,17 @@ void WalkAST::VisitCallExpr(CallExpr *CE SmallString<256> S; llvm::raw_svector_ostream os(S); - os << "The third argument is larger than the size of the input buffer. "; + os << "The third argument allows to potentially copy more bytes than it should. "; + os << "Replace with the value "; if (!DstName.empty()) -os << "Replace with the value 'sizeof(" << DstName << ")` or lower"; + os << "sizeof(" << DstName << ")"; + else + os << "sizeof()"; + os << " or lower"; BR.EmitBasicReport(FD, Checker, "Anti-pattern in the argument", - "C String API", os.str(), Loc, - LenArg->getSourceRange()); + "C String API", os.str(), Loc, + LenArg->getSourceRange()); } } Modified: cfe/trunk/test/Analysis/cstring-syntax.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cstring-syntax.c?rev=342832&r1=342831&r2=342832&view=diff == --- cfe/trunk/test/Analysis/cstring-syntax.c (original) +++ cfe/trunk/test/Analysis/cstring-syntax.c Sun Sep 23 01:30:17 2018 @@ -7,6 +7,7 @@ typedef __SIZE_TYPE__ size_t; char *strncat(char *, const char *, size_t); size_t strlen (const char *s); size_t strlcpy(char *, const char *, size_t); +size_t strlcat(char *, const char *, size_t); void testStrncat(const char *src) { char dest[10]; @@ -27,9 +28,27 @@ void testStrlcpy(const char *src) { strlcpy(dest, src, sizeof(dest)); strlcpy(dest, src, destlen); strlcpy(dest, src, 10); - strlcpy(dest, src, 20); // expected-warning {{The third argument is larger than the size of the input buffer. Replace with the value 'sizeof(dest)` or lower}} - strlcpy(dest, src, badlen); // expected-warning {{The third argument is larger than the size of the input buffer. Replace with the value 'sizeof(dest)` or lower}} + strlcpy(dest, src, 20); // expected-warning {{The third argument allows to potentially copy more bytes than it should. Replace with the value sizeof(des
r335856 - OpenBSD driver needs ld.lld in sanitizer context
Author: devnexen Date: Thu Jun 28 06:49:41 2018 New Revision: 335856 URL: http://llvm.org/viewvc/llvm-project?rev=335856&view=rev Log: OpenBSD driver needs ld.lld in sanitizer context Base GNU ld is pretty ancient and does not support --dynamic-list flag. For conveniency, we can it automatically when compile with ubsan sanitizer flag. Reviewers: dberris Reviewed by: dberris Differential Revision: https://reviews.llvm.org/D48574 Modified: cfe/trunk/lib/Driver/ToolChains/OpenBSD.cpp Modified: cfe/trunk/lib/Driver/ToolChains/OpenBSD.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/OpenBSD.cpp?rev=335856&r1=335855&r2=335856&view=diff == --- cfe/trunk/lib/Driver/ToolChains/OpenBSD.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/OpenBSD.cpp Thu Jun 28 06:49:41 2018 @@ -230,7 +230,9 @@ void openbsd::Linker::ConstructJob(Compi Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); } - const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); + const char *Exec = Args.MakeArgString( + !NeedsSanitizerDeps ? getToolChain().GetLinkerPath() + : getToolChain().GetProgramPath("ld.lld")); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][StaticAnalyzer] adding timingasafe* api calls interception. (PR #76414)
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/76414 timingsafe_bcmp and timingsafe_memcmp have the same signature as their counterparts. >From eacd951c068cdc25b025a4234bc34e846a3676b1 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Tue, 26 Dec 2023 22:22:32 + Subject: [PATCH] [clang][StaticAnalyzer] adding timingasafe* api calls interception. timingsafe_bcmp and timingsafe_memcmp have the same signature as their counterparts. --- clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 4 1 file changed, 4 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 31f5b03dcdeba8..ee51bc5c10a126 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -134,6 +134,8 @@ class CStringChecker : public Checker< eval::Call, std::bind(&CStringChecker::evalMempcpy, _1, _2, _3, CK_Wide)}, {{CDF_MaybeBuiltin, {"memcmp"}, 3}, std::bind(&CStringChecker::evalMemcmp, _1, _2, _3, CK_Regular)}, + {{CDF_MaybeBuiltin, {"timingsafe_memcmp"}, 3}, + std::bind(&CStringChecker::evalMemcmp, _1, _2, _3, CK_Regular)}, {{CDF_MaybeBuiltin, {"wmemcmp"}, 3}, std::bind(&CStringChecker::evalMemcmp, _1, _2, _3, CK_Wide)}, {{CDF_MaybeBuiltin, {"memmove"}, 3}, @@ -162,6 +164,8 @@ class CStringChecker : public Checker< eval::Call, {{CDF_MaybeBuiltin, {"bcopy"}, 3}, &CStringChecker::evalBcopy}, {{CDF_MaybeBuiltin, {"bcmp"}, 3}, std::bind(&CStringChecker::evalMemcmp, _1, _2, _3, CK_Regular)}, + {{CDF_MaybeBuiltin, {"timingsafe_bcmp"}, 3}, + std::bind(&CStringChecker::evalMemcmp, _1, _2, _3, CK_Regular)}, {{CDF_MaybeBuiltin, {"bzero"}, 2}, &CStringChecker::evalBzero}, {{CDF_MaybeBuiltin, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDF_MaybeBuiltin, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 5e99ec4cbc47b513c54f2579529aed611cd8b847 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH 1/3] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 43 +++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 59be236ca1c7695..cea99fad3e84367 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,6 +165,7 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -219,6 +220,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2515,6 +2517,47 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, +const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = + assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, +C.getSVal(Buffer.Expression), +SizeVal, SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// >From 7c9e5463947ceb7fa17bfeab7df243411907904b Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 6 Mar 2024 17:38:25 + Subject: [PATCH 2/3] few fixes and tests additions --- .../Checkers/CStringChecker.cpp | 51 +++ clang/test/Analysis/bstring.c | 39 ++ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index cea99fad3e84367..4d0492bcaf159e4 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,7 +165,8 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, - {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, + {{CDM::CLibrary, {"getentropy"}, 2}, + std::bind(&CStringChecker::evalGetentropy, _1, _2, _3, CK_Regular)}, }; // These require a bit of special handling. @@ -220,7 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; - void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call, CharKind CK) const; // Utilit
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 010c0c2acddbe36a84382284835e94bffe94b040 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH 1/3] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 43 +++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 59be236ca1c769..cea99fad3e8436 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,6 +165,7 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -219,6 +220,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2515,6 +2517,47 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, +const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = + assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, +C.getSVal(Buffer.Expression), +SizeVal, SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// >From 2866da018b137f2c099f733920a1e15b7e41d289 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 6 Mar 2024 17:38:25 + Subject: [PATCH 2/3] few fixes and tests additions --- .../Checkers/CStringChecker.cpp | 51 +++ clang/test/Analysis/bstring.c | 39 ++ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index cea99fad3e8436..4d0492bcaf159e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,7 +165,8 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, - {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, + {{CDM::CLibrary, {"getentropy"}, 2}, + std::bind(&CStringChecker::evalGetentropy, _1, _2, _3, CK_Regular)}, }; // These require a bit of special handling. @@ -220,7 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; - void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call, CharKind CK) const; // Utility me
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 1b2fec2c9a41be4ad216d7032189f561eed3f751 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH 1/2] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 43 +++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 59be236ca1c769..cea99fad3e8436 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,6 +165,7 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -219,6 +220,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2515,6 +2517,47 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, +const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = + assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, +C.getSVal(Buffer.Expression), +SizeVal, SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// >From 4c626fa147aade7725e04dc633b53aefcd1347b0 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 6 Mar 2024 17:38:25 + Subject: [PATCH 2/2] few fixes and tests additions --- .../Checkers/CStringChecker.cpp | 51 +++ clang/test/Analysis/bstring.c | 39 ++ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index cea99fad3e8436..4d0492bcaf159e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,7 +165,8 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, - {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, + {{CDM::CLibrary, {"getentropy"}, 2}, + std::bind(&CStringChecker::evalGetentropy, _1, _2, _3, CK_Regular)}, }; // These require a bit of special handling. @@ -220,7 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; - void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call, CharKind CK) const; // Utility me
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 1b2fec2c9a41be4ad216d7032189f561eed3f751 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH 1/3] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 43 +++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 59be236ca1c769..cea99fad3e8436 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,6 +165,7 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -219,6 +220,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2515,6 +2517,47 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, +const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = + assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, +C.getSVal(Buffer.Expression), +SizeVal, SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// >From 4c626fa147aade7725e04dc633b53aefcd1347b0 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 6 Mar 2024 17:38:25 + Subject: [PATCH 2/3] few fixes and tests additions --- .../Checkers/CStringChecker.cpp | 51 +++ clang/test/Analysis/bstring.c | 39 ++ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index cea99fad3e8436..4d0492bcaf159e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -165,7 +165,8 @@ class CStringChecker : public Checker< eval::Call, {{CDM::CLibrary, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDM::CLibrary, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDM::CLibrary, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, - {{CDM::CLibrary, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, + {{CDM::CLibrary, {"getentropy"}, 2}, + std::bind(&CStringChecker::evalGetentropy, _1, _2, _3, CK_Regular)}, }; // These require a bit of special handling. @@ -220,7 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; - void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call, CharKind CK) const; // Utility me
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/83675 since it went way beyond just openbsd, adding basic check for possible misusage. >From f9e571bfa3e64d9fb54e965f3c363aef40fa3b80 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 42 +++ 1 file changed, 42 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index b7b64c3da4f6c8..b6b0878459f0c2 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -166,6 +166,7 @@ class CStringChecker : public Checker< eval::Call, {{CDF_MaybeBuiltin, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDF_MaybeBuiltin, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDF_MaybeBuiltin, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDF_MaybeBuiltin, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -220,6 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2516,6 +2518,46 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = +assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize( + C, State, Buffer.Expression, C.getSVal(Buffer.Expression), SizeVal, + SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 685c7e56c1ce8d2e11c0f9a97f6c4d24f63a05b8 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 43 +++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index b7b64c3da4f6c8..5b4c3912f13006 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -166,6 +166,7 @@ class CStringChecker : public Checker< eval::Call, {{CDF_MaybeBuiltin, {"explicit_bzero"}, 2}, &CStringChecker::evalBzero}, {{CDF_MaybeBuiltin, {"sprintf"}, 2}, &CStringChecker::evalSprintf}, {{CDF_MaybeBuiltin, {"snprintf"}, 2}, &CStringChecker::evalSnprintf}, + {{CDF_MaybeBuiltin, {"getentropy"}, 2}, &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -220,6 +221,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded, bool IsBuiltin) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2516,6 +2518,47 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, +const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + constexpr int BufferMaxSize = 256; + + SVal SizeVal = C.getSVal(Size.Expression); + QualType SizeTy = Size.Expression->getType(); + + ProgramStateRef StateZeroSize, StateNonZeroSize; + std::tie(StateZeroSize, StateNonZeroSize) = + assumeZero(C, State, SizeVal, SizeTy); + + SVal Buff = C.getSVal(Buffer.Expression); + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + auto SizeLoc = SizeVal.getAs(); + auto size = SizeLoc->getValue().getExtValue(); + + if (size > BufferMaxSize) { +ErrorMessage Message; +llvm::raw_svector_ostream Os(Message); +Os << " destination buffer size is greater than " << BufferMaxSize; +emitOutOfBoundsBug(C, StateNonZeroSize, Buffer.Expression, Message); +return; + } + + State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, +C.getSVal(Buffer.Expression), +SizeVal, SizeTy); + + C.addTransition(State); +} + //===--===// // The driver method, and other Checker callbacks. //===--===// ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AST] fix dereference on class/struct layouts check. (PR #83686)
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/83686 close #83671. >From 49c888993ee4ce566db8f5b8d4932cee81b8f701 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 18:00:10 + Subject: [PATCH] [clang][AST] fix dereference on class/struct layouts check. close #83671. --- clang/lib/AST/RecordLayoutBuilder.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index a3b7431f7ffd6d..195f17d2e5a42f 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -205,15 +205,15 @@ void EmptySubobjectMap::ComputeEmptySubobjectSizes() { // Check the fields. for (const FieldDecl *FD : Class->fields()) { +const CXXRecordDecl *MemberDecl; const RecordType *RT = Context.getBaseElementType(FD->getType())->getAs(); -// We only care about record types. -if (!RT) +// We only care about members layout. +if (!RT || !(MemberDecl = RT->getAsCXXRecordDecl())) continue; CharUnits EmptySize; -const CXXRecordDecl *MemberDecl = RT->getAsCXXRecordDecl(); const ASTRecordLayout &Layout = Context.getASTRecordLayout(MemberDecl); if (MemberDecl->isEmpty()) { // If the class decl is empty, get its size. ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AST] fix dereference on class/struct layouts check. (PR #83686)
devnexen wrote: it seems [there is an ongoing fix](https://github.com/llvm/llvm-project/pull/83688), could you possibly try so we can just close this one. https://github.com/llvm/llvm-project/pull/83686 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AST] fix dereference on class/struct layouts check. (PR #83686)
https://github.com/devnexen closed https://github.com/llvm/llvm-project/pull/83686 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r370035 - [ReleaseNotes] MemorySanitizer support of ASLR on FreeBSD
Author: devnexen Date: Tue Aug 27 03:04:03 2019 New Revision: 370035 URL: http://llvm.org/viewvc/llvm-project?rev=370035&view=rev Log: [ReleaseNotes] MemorySanitizer support of ASLR on FreeBSD Reviewers: sylvestre.ledru, kcc Reviewed By: sylvestre.ledru Differential Revision: https://reviews.llvm.org/D66792 Modified: cfe/trunk/docs/MemorySanitizer.rst Modified: cfe/trunk/docs/MemorySanitizer.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/MemorySanitizer.rst?rev=370035&r1=370034&r2=370035&view=diff == --- cfe/trunk/docs/MemorySanitizer.rst (original) +++ cfe/trunk/docs/MemorySanitizer.rst Tue Aug 27 03:04:03 2019 @@ -204,6 +204,9 @@ Limitations non-position-independent executables, and could fail on some Linux kernel versions with disabled ASLR. Refer to documentation for older versions for more details. +* MemorySanitizer might be incompatible with position-independent executables + from FreeBSD 13 but there is a check done at runtime and throws a warning + in this case. Current Status == ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 13e2296 - [clang] update of the DragonFlyBSD's driver for the 5.8.x releases
Author: David Carlier Date: 2020-10-19T14:04:49+01:00 New Revision: 13e22961f8b45fb76e6d60c0f987a07009815f02 URL: https://github.com/llvm/llvm-project/commit/13e22961f8b45fb76e6d60c0f987a07009815f02 DIFF: https://github.com/llvm/llvm-project/commit/13e22961f8b45fb76e6d60c0f987a07009815f02.diff LOG: [clang] update of the DragonFlyBSD's driver for the 5.8.x releases Reviewers: sepavloff, jyknight Reviewed By: sepavloff Differential Revision: https://reviews.llvm.org/D89690 Added: Modified: clang/lib/Driver/ToolChains/DragonFly.cpp Removed: diff --git a/clang/lib/Driver/ToolChains/DragonFly.cpp b/clang/lib/Driver/ToolChains/DragonFly.cpp index 08176e507eed..9568b47e89e6 100644 --- a/clang/lib/Driver/ToolChains/DragonFly.cpp +++ b/clang/lib/Driver/ToolChains/DragonFly.cpp @@ -120,11 +120,11 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA, AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { -CmdArgs.push_back("-L/usr/lib/gcc50"); +CmdArgs.push_back("-L/usr/lib/gcc80"); if (!Args.hasArg(options::OPT_static)) { CmdArgs.push_back("-rpath"); - CmdArgs.push_back("/usr/lib/gcc50"); + CmdArgs.push_back("/usr/lib/gcc80"); } if (D.CCCIsCXX()) { @@ -189,7 +189,7 @@ DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple, getFilePaths().push_back(getDriver().Dir + "/../lib"); getFilePaths().push_back("/usr/lib"); - getFilePaths().push_back("/usr/lib/gcc50"); + getFilePaths().push_back("/usr/lib/gcc80"); } Tool *DragonFly::buildAssembler() const { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [compiler-rt] adding safestack support for sunos platforms. (PR #95648)
https://github.com/devnexen closed https://github.com/llvm/llvm-project/pull/95648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [compiler-rt] adding safestack support for sunos platforms. (PR #95648)
devnexen wrote: oh I see let me figure out a fix, getting into it. https://github.com/llvm/llvm-project/pull/95648 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [safestack] Various Solaris fixes (PR #98001)
devnexen wrote: you do not need to worry I won t do any illumos/solaris work anytime soon, feel free to do xray port and all the rest. https://github.com/llvm/llvm-project/pull/98001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. (PR #83675)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83675 >From 39a9b19e266275624e472bd3fbd5fdab542a5c31 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 2 Mar 2024 14:56:15 + Subject: [PATCH] [clang][StaticAnalyzer] Adding getentropy to CStringChecker. since it went way beyond just openbsd, adding basic check for possible misusage. --- .../Checkers/CStringChecker.cpp | 49 ++ clang/test/Analysis/bstring.c | 67 +++ 2 files changed, 116 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 63844563de44f1..25b7e131d84619 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -186,6 +186,8 @@ class CStringChecker : public Checker< eval::Call, &CStringChecker::evalSprintf}, {{CDM::CLibraryMaybeHardened, {"snprintf"}, std::nullopt, 3}, &CStringChecker::evalSnprintf}, + {{CDM::CLibraryMaybeHardened, {"getentropy"}, 2}, + &CStringChecker::evalGetentropy}, }; // These require a bit of special handling. @@ -240,6 +242,7 @@ class CStringChecker : public Checker< eval::Call, void evalSnprintf(CheckerContext &C, const CallEvent &Call) const; void evalSprintfCommon(CheckerContext &C, const CallEvent &Call, bool IsBounded) const; + void evalGetentropy(CheckerContext &C, const CallEvent &Call) const; // Utility methods std::pair @@ -2535,6 +2538,52 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, C.addTransition(State); } +void CStringChecker::evalGetentropy(CheckerContext &C, const CallEvent &Call) const { + DestinationArgExpr Buffer = {{Call.getArgExpr(0), 0}}; + SizeArgExpr Size = {{Call.getArgExpr(1), 1}}; + ProgramStateRef State = C.getState(); + SValBuilder &SVB = C.getSValBuilder(); + + std::optional SizeVal = C.getSVal(Size.Expression).getAs(); + if (!SizeVal) +return; + + std::optional MaxLength = SVB.makeIntVal(256, C.getASTContext().IntTy).getAs(); + QualType SizeTy = Size.Expression->getType(); + + SVal Buff = C.getSVal(Buffer.Expression); + auto [StateZeroSize, StateNonZeroSize] = + assumeZero(C, State, *SizeVal, SizeTy); + + if (StateZeroSize && !StateNonZeroSize) { +State = invalidateDestinationBufferBySize(C, State, Buffer.Expression, Buff, *SizeVal, SizeTy); +C.addTransition(State); +return; + } + + State = checkNonNull(C, StateNonZeroSize, Buffer, Buff); + if (!State) +return; + + State = CheckBufferAccess(C, State, Buffer, Size, AccessKind::write); + if (!State) +return; + + QualType cmpTy = C.getSValBuilder().getConditionType(); + auto [sizeAboveLimit, sizeNotAboveLimit] = State->assume( +SVB + .evalBinOpNN(State, BO_GT, *SizeVal, *MaxLength, cmpTy) + .castAs()); + if (sizeAboveLimit && !sizeNotAboveLimit) { +emitOutOfBoundsBug(C, sizeAboveLimit, Buffer.Expression, "must be smaller than or equal to 256"); + } else { +State = invalidateDestinationBufferBySize(C, sizeNotAboveLimit, Buffer.Expression, +Buff, +*SizeVal, SizeTy); +C.addTransition(State); + } +} + //===--===// // The driver method, and other Checker callbacks. //===--===// diff --git a/clang/test/Analysis/bstring.c b/clang/test/Analysis/bstring.c index f015e0b5d9fb7b..1c4810b499b0a9 100644 --- a/clang/test/Analysis/bstring.c +++ b/clang/test/Analysis/bstring.c @@ -529,3 +529,70 @@ void nocrash_on_locint_offset(void *addr, void* from, struct S s) { size_t iAdd = (size_t) addr; memcpy(((void *) &(s.f)), from, iAdd); } + +//===--===// +// getentropy() +//===--===// + +int getentropy(void *d, size_t n); + +int getentropy0(void) { + char buf[16] = {0}; + + int r = getentropy(buf, sizeof(buf)); // no-warning + return r; +} + +int getentropy1(void) { + char buf[257] = {0}; + + int r = getentropy(buf, 256); // no-warning + return r; +} + +int getentropy2(void) { + char buf[1024] = {0}; + + int r = getentropy(buf, sizeof(buf)); // expected-warning{{must be smaller than or equal to 256}} + return r; +} + +int getentropy3(void) { + char buf[256] = {0}; + + int r = getentropy(buf, 0); // no-warning + return r; +} + +int getentropy4(size_t arg) { + char buf[256] = {0}; + + int r = getentropy(buf, arg); // no-warning + return r; +} + +int do_something(size_t arg) { + char buf[256] = {0}; + int r = getentropy(buf, arg); // no-warning + return r; +} + +int getentropy5(size_t arg) { + char buf[257] = {0}
[clang] [compiler-rt] [compiler-rt] adding safestack support for sunos platforms. (PR #95648)
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/95648 None >From e7b7e784e4f36b76d1dd8ddfa8ea296859443a10 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 15 Jun 2024 09:48:58 + Subject: [PATCH] [compiler-rt] adding safestack support for sunos platforms. --- clang/lib/Driver/ToolChains/Solaris.cpp| 1 + compiler-rt/cmake/config-ix.cmake | 2 +- compiler-rt/lib/safestack/safestack_platform.h | 10 +- compiler-rt/test/safestack/lit.cfg.py | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp index 7126e018ca5b6..e82ed2ca79ffd 100644 --- a/clang/lib/Driver/ToolChains/Solaris.cpp +++ b/clang/lib/Driver/ToolChains/Solaris.cpp @@ -341,6 +341,7 @@ SanitizerMask Solaris::getSupportedSanitizers() const { Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; } + Res |= SanitizerKind::SafeStack; Res |= SanitizerKind::Vptr; return Res; } diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index bddaa37579fd7..c05bdd58519fb 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -833,7 +833,7 @@ else() endif() if (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND -OS_NAME MATCHES "Linux|FreeBSD|NetBSD") +OS_NAME MATCHES "Linux|FreeBSD|NetBSD|SunOS") set(COMPILER_RT_HAS_SAFESTACK TRUE) else() set(COMPILER_RT_HAS_SAFESTACK FALSE) diff --git a/compiler-rt/lib/safestack/safestack_platform.h b/compiler-rt/lib/safestack/safestack_platform.h index 2b1fc139baa90..df2f05b84f1aa 100644 --- a/compiler-rt/lib/safestack/safestack_platform.h +++ b/compiler-rt/lib/safestack/safestack_platform.h @@ -25,7 +25,7 @@ #include #include -#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX) +#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_SOLARIS) #error "Support for your platform has not been implemented" #endif @@ -39,6 +39,10 @@ extern "C" void *__mmap(void *, size_t, int, int, int, int, off_t); #include #endif +#if SANITIZER_SOLARIS +#include +#endif + namespace safestack { #if SANITIZER_NETBSD @@ -73,6 +77,8 @@ inline ThreadId GetTid() { long Tid; thr_self(&Tid); return Tid; +#elif SANITIZER_SOLARIS + return thr_self(); #else return syscall(SYS_gettid); #endif @@ -83,6 +89,8 @@ inline int TgKill(pid_t pid, ThreadId tid, int sig) { DEFINE__REAL(int, _lwp_kill, int a, int b); (void)pid; return _REAL(_lwp_kill, tid, sig); +#elif SANITIZER_SOLARIS + return syscall(SYS_lwp_kill, tid, sig); #elif SANITIZER_FREEBSD return syscall(SYS_thr_kill2, pid, tid, sig); #else diff --git a/compiler-rt/test/safestack/lit.cfg.py b/compiler-rt/test/safestack/lit.cfg.py index aadb8bf0d5c77..17dfae46a412b 100644 --- a/compiler-rt/test/safestack/lit.cfg.py +++ b/compiler-rt/test/safestack/lit.cfg.py @@ -33,5 +33,5 @@ ) ) -if config.host_os not in ["Linux", "FreeBSD", "NetBSD"]: +if config.host_os not in ["Linux", "FreeBSD", "NetBSD", "SunOS"]: config.unsupported = True ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [compiler-rt] adding safestack support for sunos platforms. (PR #95648)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/95648 >From 33f68c3c59549a966871ea87f0f4b4c5df0a3d04 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 15 Jun 2024 09:48:58 + Subject: [PATCH] [compiler-rt] adding safestack support for sunos platforms. --- clang/lib/Driver/ToolChains/Solaris.cpp| 1 + compiler-rt/cmake/config-ix.cmake | 2 +- compiler-rt/lib/safestack/safestack_platform.h | 11 ++- compiler-rt/test/safestack/lit.cfg.py | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp index 7126e018ca5b6..e82ed2ca79ffd 100644 --- a/clang/lib/Driver/ToolChains/Solaris.cpp +++ b/clang/lib/Driver/ToolChains/Solaris.cpp @@ -341,6 +341,7 @@ SanitizerMask Solaris::getSupportedSanitizers() const { Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; } + Res |= SanitizerKind::SafeStack; Res |= SanitizerKind::Vptr; return Res; } diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index bddaa37579fd7..c05bdd58519fb 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -833,7 +833,7 @@ else() endif() if (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND -OS_NAME MATCHES "Linux|FreeBSD|NetBSD") +OS_NAME MATCHES "Linux|FreeBSD|NetBSD|SunOS") set(COMPILER_RT_HAS_SAFESTACK TRUE) else() set(COMPILER_RT_HAS_SAFESTACK FALSE) diff --git a/compiler-rt/lib/safestack/safestack_platform.h b/compiler-rt/lib/safestack/safestack_platform.h index 2b1fc139baa90..2d952de034ea9 100644 --- a/compiler-rt/lib/safestack/safestack_platform.h +++ b/compiler-rt/lib/safestack/safestack_platform.h @@ -25,7 +25,8 @@ #include #include -#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX) +#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX || \ + SANITIZER_SOLARIS) #error "Support for your platform has not been implemented" #endif @@ -39,6 +40,10 @@ extern "C" void *__mmap(void *, size_t, int, int, int, int, off_t); #include #endif +#if SANITIZER_SOLARIS +# include +#endif + namespace safestack { #if SANITIZER_NETBSD @@ -73,6 +78,8 @@ inline ThreadId GetTid() { long Tid; thr_self(&Tid); return Tid; +#elif SANITIZER_SOLARIS + return thr_self(); #else return syscall(SYS_gettid); #endif @@ -83,6 +90,8 @@ inline int TgKill(pid_t pid, ThreadId tid, int sig) { DEFINE__REAL(int, _lwp_kill, int a, int b); (void)pid; return _REAL(_lwp_kill, tid, sig); +#elif SANITIZER_SOLARIS + return syscall(SYS_lwp_kill, tid, sig); #elif SANITIZER_FREEBSD return syscall(SYS_thr_kill2, pid, tid, sig); #else diff --git a/compiler-rt/test/safestack/lit.cfg.py b/compiler-rt/test/safestack/lit.cfg.py index aadb8bf0d5c77..17dfae46a412b 100644 --- a/compiler-rt/test/safestack/lit.cfg.py +++ b/compiler-rt/test/safestack/lit.cfg.py @@ -33,5 +33,5 @@ ) ) -if config.host_os not in ["Linux", "FreeBSD", "NetBSD"]: +if config.host_os not in ["Linux", "FreeBSD", "NetBSD", "SunOS"]: config.unsupported = True ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [compiler-rt] adding safestack support for sunos platforms. (PR #95648)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/95648 >From 18ce8ba99de7a42f17f0878819b20ed3faa2de13 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 15 Jun 2024 09:48:58 + Subject: [PATCH] [compiler-rt] adding safestack support for sunos platforms. --- clang/lib/Driver/ToolChains/Solaris.cpp| 1 + compiler-rt/cmake/config-ix.cmake | 2 +- compiler-rt/lib/safestack/safestack_platform.h | 13 +++-- compiler-rt/test/safestack/lit.cfg.py | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp index 7126e018ca5b6..e82ed2ca79ffd 100644 --- a/clang/lib/Driver/ToolChains/Solaris.cpp +++ b/clang/lib/Driver/ToolChains/Solaris.cpp @@ -341,6 +341,7 @@ SanitizerMask Solaris::getSupportedSanitizers() const { Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; } + Res |= SanitizerKind::SafeStack; Res |= SanitizerKind::Vptr; return Res; } diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index bddaa37579fd7..c05bdd58519fb 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -833,7 +833,7 @@ else() endif() if (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND -OS_NAME MATCHES "Linux|FreeBSD|NetBSD") +OS_NAME MATCHES "Linux|FreeBSD|NetBSD|SunOS") set(COMPILER_RT_HAS_SAFESTACK TRUE) else() set(COMPILER_RT_HAS_SAFESTACK FALSE) diff --git a/compiler-rt/lib/safestack/safestack_platform.h b/compiler-rt/lib/safestack/safestack_platform.h index 2b1fc139baa90..822611315d010 100644 --- a/compiler-rt/lib/safestack/safestack_platform.h +++ b/compiler-rt/lib/safestack/safestack_platform.h @@ -25,8 +25,9 @@ #include #include -#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX) -#error "Support for your platform has not been implemented" +#if !(SANITIZER_NETBSD || SANITIZER_FREEBSD || SANITIZER_LINUX || \ + SANITIZER_SOLARIS) +# error "Support for your platform has not been implemented" #endif #if SANITIZER_NETBSD @@ -39,6 +40,10 @@ extern "C" void *__mmap(void *, size_t, int, int, int, int, off_t); #include #endif +#if SANITIZER_SOLARIS +# include +#endif + namespace safestack { #if SANITIZER_NETBSD @@ -73,6 +78,8 @@ inline ThreadId GetTid() { long Tid; thr_self(&Tid); return Tid; +#elif SANITIZER_SOLARIS + return thr_self(); #else return syscall(SYS_gettid); #endif @@ -83,6 +90,8 @@ inline int TgKill(pid_t pid, ThreadId tid, int sig) { DEFINE__REAL(int, _lwp_kill, int a, int b); (void)pid; return _REAL(_lwp_kill, tid, sig); +#elif SANITIZER_SOLARIS + return syscall(SYS_lwp_kill, tid, sig); #elif SANITIZER_FREEBSD return syscall(SYS_thr_kill2, pid, tid, sig); #else diff --git a/compiler-rt/test/safestack/lit.cfg.py b/compiler-rt/test/safestack/lit.cfg.py index aadb8bf0d5c77..17dfae46a412b 100644 --- a/compiler-rt/test/safestack/lit.cfg.py +++ b/compiler-rt/test/safestack/lit.cfg.py @@ -33,5 +33,5 @@ ) ) -if config.host_os not in ["Linux", "FreeBSD", "NetBSD"]: +if config.host_os not in ["Linux", "FreeBSD", "NetBSD", "SunOS"]: config.unsupported = True ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] Rtsan fbsd (PR #125389)
devnexen wrote: I do not plan other commits, except maybe bug fixes. rtsan would have about the same potential usefulness than in macos. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -43,6 +44,21 @@ static __rtsan::Context &GetContextForThisThreadImpl() { return *current_thread_context; } +#else + +// On FreeBSD, pthread api cannot be used as calloc is called under the hood +// at library initialization time. devnexen wrote: I ll try to see what I can do later this week. basically even just compiling a binary doing nothing I get from lldb a recursive call on libpthread initialisation -> calloc, rinse and repeat ... then eventually crash. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -43,6 +44,21 @@ static __rtsan::Context &GetContextForThisThreadImpl() { return *current_thread_context; } +#else + +// On FreeBSD, pthread api cannot be used as calloc is called under the hood +// at library initialization time. +static __thread Context *ctx = nullptr; + +static __rtsan::Context &GetContextForThisThreadImpl() { + if (ctx == nullptr) { +ctx = static_cast(MmapOrDie(sizeof(Context), "RtsanContext")); +new (ctx) Context(); devnexen wrote: Yes I tried that originally but it freezes I ll try again or trying to make pthread api works. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote: Unfortunately when mmap/calloc are hit rtsan seems already initialized, in that case internal_mmap is never called. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote:  https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote: oh yes that s pthread_once but I ll give you the screenshot soon-ish. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote:  https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/125389 >From e40672e8137c0546b1604795901ccea8b15f7932 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 2 Feb 2025 09:36:50 + Subject: [PATCH 1/3] [compiler-rt][rtsan] porting the sanitizer to FreeBSD. Most of the apple api exceptions also apply to freebsd, however to create a per-thread realtime context pthread api cannot be used since freebsd calls calloc in _thr_alloc(). --- compiler-rt/lib/rtsan/rtsan_context.cpp | 16 .../lib/rtsan/rtsan_interceptors_posix.cpp | 4 ++-- .../tests/rtsan_test_interceptors_posix.cpp | 4 +++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/rtsan/rtsan_context.cpp b/compiler-rt/lib/rtsan/rtsan_context.cpp index 536d62e81e2fb66..dacc9b6dedf4029 100644 --- a/compiler-rt/lib/rtsan/rtsan_context.cpp +++ b/compiler-rt/lib/rtsan/rtsan_context.cpp @@ -19,6 +19,7 @@ using namespace __sanitizer; using namespace __rtsan; +#if !SANITIZER_FREEBSD static pthread_key_t context_key; static pthread_once_t key_once = PTHREAD_ONCE_INIT; @@ -43,6 +44,21 @@ static __rtsan::Context &GetContextForThisThreadImpl() { return *current_thread_context; } +#else + +// On FreeBSD, pthread api cannot be used as calloc is called under the hood +// at library initialization time. +static __thread Context *ctx = nullptr; + +static __rtsan::Context &GetContextForThisThreadImpl() { + if (ctx == nullptr) { +ctx = static_cast(MmapOrDie(sizeof(Context), "RtsanContext")); +new (ctx) Context(); + } + + return *ctx; +} +#endif __rtsan::Context::Context() = default; diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 83e6cdd4a009410..b76413dc2e462f1 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -939,7 +939,7 @@ INTERCEPTOR(int, msync, void *addr, size_t length, int flag) { return REAL(msync)(addr, length, flag); } -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD INTERCEPTOR(int, mincore, const void *addr, size_t length, char *vec) { #else INTERCEPTOR(int, mincore, void *addr, size_t length, unsigned char *vec) { @@ -1334,7 +1334,7 @@ INTERCEPTOR(ssize_t, process_vm_writev, pid_t pid, // the test. Revisit this in the future, but hopefully intercepting fork/exec is // enough to dissuade usage of wait by proxy. -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD #define INT_TYPE_SYSCALL int #else #define INT_TYPE_SYSCALL long diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp index 075f5974b7562a8..e5290ababec6685 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -280,7 +280,7 @@ TEST_F(RtsanOpenedMmapTest, MsyncDiesWhenRealtime) { } TEST_F(RtsanOpenedMmapTest, MincoreDiesWhenRealtime) { -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD std::vector vec(GetSize() / 1024); #else std::vector vec(GetSize() / 1024); @@ -1539,6 +1539,7 @@ TEST_F(KqueueTest, KeventDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_APPLE TEST_F(KqueueTest, Kevent64DiesWhenRealtime) { struct kevent64_s event; EV_SET64(&event, 0, EVFILT_READ, EV_ADD, 0, 0, 0, 0, 0); @@ -1551,6 +1552,7 @@ TEST_F(KqueueTest, Kevent64DiesWhenRealtime) { ExpectRealtimeDeath(Func, "kevent64"); ExpectNonRealtimeSurvival(Func); } +#endif // SANITIZER_APPLE #endif // SANITIZER_INTERCEPT_KQUEUE #if SANITIZER_LINUX >From 05ad49c3ff4fd185ab0618a1cfd05c2a86f36dcc Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 2 Feb 2025 09:38:52 + Subject: [PATCH 2/3] freebsd clang frontend update. --- clang/lib/Driver/ToolChains/FreeBSD.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index a6d859f0ebfec23..baabfabf26267f6 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -497,6 +497,7 @@ SanitizerMask FreeBSD::getSupportedSanitizers() const { Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; Res |= SanitizerKind::Vptr; + Res |= SanitizerKind::Realtime; if (IsAArch64 || IsX86_64 || IsMIPS64) { Res |= SanitizerKind::Leak; Res |= SanitizerKind::Thread; >From 49a4564ac7a3e3042178817c407d32086bb543d3 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 7 Feb 2025 13:19:37 + Subject: [PATCH 3/3] using pthread api for context creation. but disabling mmap interception for this platform, which is the root cause of the previous infinite call recursion. --- compiler-rt/cmake/config-ix.cmake| 4 ++-- compiler-rt/lib/rtsan/rtsan_context.c
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -43,6 +44,21 @@ static __rtsan::Context &GetContextForThisThreadImpl() { return *current_thread_context; } +#else + +// On FreeBSD, pthread api cannot be used as calloc is called under the hood +// at library initialization time. devnexen wrote: So I know a bit more now. What I really need to do is either disabling mmap or using internal allocator before hands then it works, test pass in similar fashion as macos. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
https://github.com/devnexen edited https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote:  https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] [rtsan] Enable RealtimeSanitizer for FreeBSD (PR #125389)
@@ -864,11 +864,18 @@ INTERCEPTOR(void *, pvalloc, size_t size) { #define RTSAN_MAYBE_INTERCEPT_PVALLOC #endif +#if !SANITIZER_FREEBSD +// enabling this interception on freebsd leads to infinite recursion +// on pthread lib initialization devnexen wrote: sure let me give a try. https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] Rtsan fbsd (PR #125389)
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/125389 None >From 19d4d1b3501d8524a6d88d62317dd0ea0022ebfb Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 2 Feb 2025 09:36:50 + Subject: [PATCH 1/2] [compiler-rt][rtsan] porting the sanitizer to FreeBSD. Most of the apple api exceptions also apply to freebsd, however to create a per-thread realtime context pthread api cannot be used since freebsd calls calloc in _thr_alloc(). --- compiler-rt/lib/rtsan/rtsan_context.cpp | 16 .../lib/rtsan/rtsan_interceptors_posix.cpp | 4 ++-- .../tests/rtsan_test_interceptors_posix.cpp | 4 +++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/rtsan/rtsan_context.cpp b/compiler-rt/lib/rtsan/rtsan_context.cpp index 536d62e81e2fb6..dacc9b6dedf402 100644 --- a/compiler-rt/lib/rtsan/rtsan_context.cpp +++ b/compiler-rt/lib/rtsan/rtsan_context.cpp @@ -19,6 +19,7 @@ using namespace __sanitizer; using namespace __rtsan; +#if !SANITIZER_FREEBSD static pthread_key_t context_key; static pthread_once_t key_once = PTHREAD_ONCE_INIT; @@ -43,6 +44,21 @@ static __rtsan::Context &GetContextForThisThreadImpl() { return *current_thread_context; } +#else + +// On FreeBSD, pthread api cannot be used as calloc is called under the hood +// at library initialization time. +static __thread Context *ctx = nullptr; + +static __rtsan::Context &GetContextForThisThreadImpl() { + if (ctx == nullptr) { +ctx = static_cast(MmapOrDie(sizeof(Context), "RtsanContext")); +new (ctx) Context(); + } + + return *ctx; +} +#endif __rtsan::Context::Context() = default; diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 3ea9e54a046cf8..2bd2f4c7ea8dd1 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -929,7 +929,7 @@ INTERCEPTOR(int, msync, void *addr, size_t length, int flag) { return REAL(msync)(addr, length, flag); } -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD INTERCEPTOR(int, mincore, const void *addr, size_t length, char *vec) { #else INTERCEPTOR(int, mincore, void *addr, size_t length, unsigned char *vec) { @@ -1324,7 +1324,7 @@ INTERCEPTOR(ssize_t, process_vm_writev, pid_t pid, // the test. Revisit this in the future, but hopefully intercepting fork/exec is // enough to dissuade usage of wait by proxy. -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD #define INT_TYPE_SYSCALL int #else #define INT_TYPE_SYSCALL long diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp index e3688157a842c7..ea81e510fd7173 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -280,7 +280,7 @@ TEST_F(RtsanOpenedMmapTest, MsyncDiesWhenRealtime) { } TEST_F(RtsanOpenedMmapTest, MincoreDiesWhenRealtime) { -#if SANITIZER_APPLE +#if SANITIZER_APPLE || SANITIZER_FREEBSD std::vector vec(GetSize() / 1024); #else std::vector vec(GetSize() / 1024); @@ -1527,6 +1527,7 @@ TEST_F(KqueueTest, KeventDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } +#if SANITIZER_APPLE TEST_F(KqueueTest, Kevent64DiesWhenRealtime) { struct kevent64_s event; EV_SET64(&event, 0, EVFILT_READ, EV_ADD, 0, 0, 0, 0, 0); @@ -1539,6 +1540,7 @@ TEST_F(KqueueTest, Kevent64DiesWhenRealtime) { ExpectRealtimeDeath(Func, "kevent64"); ExpectNonRealtimeSurvival(Func); } +#endif // SANITIZER_APPLE #endif // SANITIZER_INTERCEPT_KQUEUE #if SANITIZER_LINUX >From c962385b9eac1abc002c0aa80b50f07efaa7897e Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 2 Feb 2025 09:38:52 + Subject: [PATCH 2/2] freebsd clang frontend update. --- clang/lib/Driver/ToolChains/FreeBSD.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index a6d859f0ebfec2..baabfabf26267f 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -497,6 +497,7 @@ SanitizerMask FreeBSD::getSupportedSanitizers() const { Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; Res |= SanitizerKind::Vptr; + Res |= SanitizerKind::Realtime; if (IsAArch64 || IsX86_64 || IsMIPS64) { Res |= SanitizerKind::Leak; Res |= SanitizerKind::Thread; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [compiler-rt] Rtsan fbsd (PR #125389)
https://github.com/devnexen ready_for_review https://github.com/llvm/llvm-project/pull/125389 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Driver][FreeBSD][NFC] Remove some code duplication (PR #120652)
https://github.com/devnexen approved this pull request. makes sense https://github.com/llvm/llvm-project/pull/120652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Driver][OpenBSD] Remove riscv32 bit (PR #122525)
https://github.com/devnexen approved this pull request. https://github.com/llvm/llvm-project/pull/122525 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Driver] Haiku address sanitizer support (PR #132335)
https://github.com/devnexen approved this pull request. https://github.com/llvm/llvm-project/pull/132335 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Driver] Haiku address sanitizer support (PR #132335)
@@ -281,3 +286,11 @@ void Haiku::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, Tool *Haiku::buildLinker() const { return new tools::haiku::Linker(*this); } bool Haiku::HasNativeLLVMSupport() const { return true; } + +SanitizerMask Haiku::getSupportedSanitizers() const { + SanitizerMask Res = ToolChain::getSupportedSanitizers(); + + Res |= SanitizerKind::Address; devnexen wrote: ah alright then.. https://github.com/llvm/llvm-project/pull/132335 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Driver] Haiku address sanitizer support (PR #132335)
@@ -281,3 +286,11 @@ void Haiku::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, Tool *Haiku::buildLinker() const { return new tools::haiku::Linker(*this); } bool Haiku::HasNativeLLVMSupport() const { return true; } + +SanitizerMask Haiku::getSupportedSanitizers() const { + SanitizerMask Res = ToolChain::getSupportedSanitizers(); + + Res |= SanitizerKind::Address; devnexen wrote: Do you have a feasibility plan ? Otherwise, fuzzer for example might be an easier promise. https://github.com/llvm/llvm-project/pull/132335 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits