[clang] [clang][Sema] Add buffer-size checks for unistd I/O functions (PR #224979)

Denys Fedoryshchenko via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 2 03:00:23 PDT 2026


================
@@ -1466,6 +1466,58 @@ void Sema::checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD,
     break;
   }
 
+  case Builtin::BIread:
+  case Builtin::BIpread:
+  case Builtin::BIpread64:
+  case Builtin::BIreadlink:
+  case Builtin::BIreadlinkat:
+  case Builtin::BIgetcwd: {
+    unsigned BufIdx = 1;
+    if (BuiltinID == Builtin::BIgetcwd)
+      BufIdx = 0;
+    else if (BuiltinID == Builtin::BIreadlinkat)
+      BufIdx = 2;
+    unsigned CountIdx = BufIdx + 1;
+    unsigned ExpectedArgs = CountIdx + 1;
+    if (BuiltinID == Builtin::BIpread || BuiltinID == Builtin::BIpread64)
+      ++ExpectedArgs;
+    if (TheCall->getNumArgs() != ExpectedArgs ||
+        !TheCall->getArg(BufIdx)->getType()->isPointerType() ||
+        !TheCall->getArg(CountIdx)->getType()->isIntegerType())
+      return;
+    if (BuiltinID != Builtin::BIgetcwd &&
+        !(BuiltinID == Builtin::BIreadlink
+              ? TheCall->getArg(0)->getType()->isPointerType()
+              : TheCall->getArg(0)->getType()->isIntegerType()))
+      return;
+    if (BuiltinID == Builtin::BIreadlinkat &&
+        !TheCall->getArg(1)->getType()->isPointerType())
+      return;
----------------
nuclearcat wrote:

Done

https://github.com/llvm/llvm-project/pull/224979


More information about the cfe-commits mailing list