================
@@ -1571,6 +1571,42 @@ void
Sema::checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD,
<< FunctionName << DestinationStr << SourceStr);
}
+void Sema::checkFortifiedLibcArgument(FunctionDecl *FD, CallExpr *TheCall) {
+ if (TheCall->isValueDependent() || TheCall->isTypeDependent())
+ return;
+
+ // Recognize the libc function by builtin identity rather than by name and
+ // system-header origin. umask is a LibBuiltin marked IgnoreSignature, so the
+ // builtin id is attached to any file-scope, C-linkage declaration of umask
+ // regardless of the libc's mode_t spelling -- including a hand-written
+ // forward declaration without <sys/stat.h>. A static/local lookalike or a
+ // C++ (non-extern-"C") declaration keeps a zero builtin id and is ignored.
+ if (FD->getBuiltinID() != Builtin::BIumask)
+ return;
+
+ // umask(mode_t): warn when the constant-evaluated argument has bits set
+ // outside the file-permission mask (0777). Those bits are ignored.
+ if (TheCall->getNumArgs() != 1)
+ return;
----------------
nickdesaulniers wrote:
Hmm...this is a lot of `umask` specific checks in a method with a more generic
name like `Sema::checkFortifiedLibcArgument`. I think `recv` has similar issues
to `umask` regarding Fortify, so we might end up breaking up/refactoring this
code imminently in https://github.com/llvm/llvm-project/pull/223520.
https://github.com/llvm/llvm-project/pull/198130
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits