Commit 843a9778 authored by Jeremy Stenglein's avatar Jeremy Stenglein Committed by Erich Keane
Browse files

Add a warning for builtin_return_address/frame_address with > 0 argument

Clang is missing a warning for
builtin_return_address/builtin_frame_address called with > 0 argument.
Gcc provides a warning for this via -Wframe-address:

https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

As calling these functions with argument > 0 has caused several crashes
for us, we would like to have the same warning as gcc here. This diff
adds the warning and makes it part of -Wmost.

Differential Revision: https://reviews.llvm.org/D75768
parent eb682b80
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ def FloatConversion :
  DiagGroup<"float-conversion", [FloatOverflowConversion,
                                 FloatZeroConversion]>;

def FrameAddress : DiagGroup<"frame-address">;
def DoublePromotion : DiagGroup<"double-promotion">;
def EnumTooLarge : DiagGroup<"enum-too-large">;
def UnsupportedNan : DiagGroup<"unsupported-nan">;
@@ -872,6 +873,7 @@ def Most : DiagGroup<"most", [
    DeleteNonVirtualDtor,
    Format,
    ForLoopAnalysis,
    FrameAddress,
    Implicit,
    InfiniteRecursion,
    IntInBoolContext,
+5 −0
Original line number Diff line number Diff line
@@ -1780,6 +1780,11 @@ def note_due_to_dllexported_class : Note<
def err_illegal_union_or_anon_struct_member : Error<
  "%select{anonymous struct|union}0 member %1 has a non-trivial "
  "%sub{select_special_member_kind}2">;
def warn_frame_address : Warning<
  "calling '%0' with a nonzero argument is unsafe">,
  InGroup<FrameAddress>, DefaultIgnore;
def warn_cxx98_compat_nontrivial_union_or_anon_struct_member : Warning<
  "%select{anonymous struct|union}0 member %1 with a non-trivial "
  "%sub{select_special_member_kind}2 is incompatible with C++98">,
+11 −0
Original line number Diff line number Diff line
@@ -1853,6 +1853,17 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
  case Builtin::BI__builtin_return_address:
    if (SemaBuiltinConstantArgRange(TheCall, 0, 0, 0xFFFF))
      return ExprError();
    // -Wframe-address warning if non-zero passed to builtin
    // return/frame address.
    Expr::EvalResult Result;
    if (TheCall->getArg(0)->EvaluateAsInt(Result, getASTContext()) &&
        Result.Val.getInt() != 0)
      Diag(TheCall->getBeginLoc(), diag::warn_frame_address)
          << ((BuiltinID == Builtin::BI__builtin_return_address)
                  ? "__builtin_return_address"
                  : "__builtin_frame_address")
          << TheCall->getSourceRange();
    break;
  }
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ CHECK-NEXT: -Wformat-security
CHECK-NEXT:      -Wformat-y2k
CHECK-NEXT:      -Wformat-invalid-specifier
CHECK-NEXT:    -Wfor-loop-analysis
CHECK-NEXT:    -Wframe-address
CHECK-NEXT:    -Wimplicit
CHECK-NEXT:      -Wimplicit-function-declaration
CHECK-NEXT:      -Wimplicit-int