[PATCH] D135682: Fix false positive related to handling of [[noreturn]] function pointers
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 12 05:47:06 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGec6da3fb9d8c: Fix false positive related to handling of [[noreturn]] function pointers (authored by arseniy-sonar, committed by steakhal).
Changed prior to commit:
https://reviews.llvm.org/D135682?vs=466827&id=467109#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135682/new/
https://reviews.llvm.org/D135682
Files:
clang/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
clang/test/Analysis/no-return.c
Index: clang/test/Analysis/no-return.c
===================================================================
--- /dev/null
+++ clang/test/Analysis/no-return.c
@@ -0,0 +1,36 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
+
+typedef void(fatal_fun)() __attribute__((__noreturn__));
+fatal_fun* fatal_fptr;
+void fatal_decl() __attribute__((__noreturn__));
+
+int rng();
+
+/// This code calls a [[noreturn]] function pointer, which used to be handled
+/// inconsistently between AST builder and CSA.
+/// In the result, CSA produces a path where this function returns non-0.
+int return_zero_or_abort_by_fnptr() {
+ if (rng()) fatal_fptr();
+ return 0;
+}
+
+/// This function calls a [[noreturn]] function.
+/// If it does return, it always returns 0.
+int return_zero_or_abort_by_direct_fun() {
+ if (rng()) fatal_decl();
+ return 0;
+}
+
+/// Trigger a division by zero issue depending on the return value
+/// of the called functions.
+int caller() {
+ int x = 0;
+ // The following if branches must never be taken.
+ if (return_zero_or_abort_by_fnptr())
+ return 1 / x; // no-warning: Dead code.
+ if (return_zero_or_abort_by_direct_fun())
+ return 1 / x; // no-warning: Dead code.
+
+ // Make sure the warning is still reported when viable.
+ return 1 / x; // expected-warning {{Division by zero}}
+}
Index: clang/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
+++ clang/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
@@ -44,9 +44,11 @@
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CE.getDecl()))
BuildSinks = FD->hasAttr<AnalyzerNoReturnAttr>() || FD->isNoReturn();
- const Expr *Callee = CE.getOriginExpr();
- if (!BuildSinks && Callee)
- BuildSinks = getFunctionExtInfo(Callee->getType()).getNoReturn();
+ if (const CallExpr *CExpr = dyn_cast_or_null<CallExpr>(CE.getOriginExpr());
+ CExpr && !BuildSinks) {
+ if (const Expr *C = CExpr->getCallee())
+ BuildSinks = getFunctionExtInfo(C->getType()).getNoReturn();
+ }
if (!BuildSinks && CE.isGlobalCFunction()) {
if (const IdentifierInfo *II = CE.getCalleeIdentifier()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135682.467109.patch
Type: text/x-patch
Size: 2267 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221012/981b5be0/attachment-0001.bin>
More information about the cfe-commits
mailing list