[libcxx-commits] [clang] [compiler-rt] [libcxx] [clang] Add unistd fortify checks and analyzer size constraints (PR #196499)
Oliver Hunt via libcxx-commits
libcxx-commits at lists.llvm.org
Tue May 12 01:48:19 PDT 2026
================
@@ -1165,7 +1165,112 @@ void Sema::checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD,
unsigned BuiltinID = UseDecl->getBuiltinID(/*ConsiderWrappers=*/true);
- if (!BuiltinID)
+ // Some libc I/O functions are intentionally not Clang builtins:
+ // * "read", "write", "readlink", "readlinkat", and "getcwd" are common
+ // identifiers (or names that appear in asm-label wrappers); declaring
+ // them as builtins triggers -Wincompatible-library-redeclaration on
+ // harmless local declarations (an error under -Werror).
+ // * pread/pwrite prototypes use off_t, whose width is platform- and
+ // macro-dependent (notably _FILE_OFFSET_BITS); a fixed builtin signature
+ // would clash with the system header on some targets.
+ // Recognize them by name, but only after checking the full POSIX prototype
+ // so that an unrelated function happening to share the name is not
+ // diagnosed as if it were the libc function.
+ enum class LibCDispatch {
+ None,
+ Read,
+ Write,
+ PRead,
+ PWrite,
+ ReadLink,
+ ReadLinkAt,
+ GetCWD,
+ };
+ LibCDispatch LibC = LibCDispatch::None;
+ StringRef LibCName;
+ if (!BuiltinID && FD->isExternC() && FD->getIdentifier() &&
----------------
ojhunt wrote:
given the name match, it might be worth just treating all integer types as the same, so `sameUnqualifiedType(a,b) || (a.isIntegerType() && b.isIntegerType())` or something general like that.
You've commented on matching vs. mismatch decls - is that from impact in existing tests, or were they from code you were writing to test behavior?
https://github.com/llvm/llvm-project/pull/196499
More information about the libcxx-commits
mailing list