r296374 - [ubsan] Factor out logic to emit a range check. NFC.

Ivan Krasin via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 27 12:46:11 PST 2017


Hi Vedant,

not on top of my head. Dmitriy, can you please take a look?

krasin

On Mon, Feb 27, 2017 at 12:43 PM, Vedant Kumar <vsk at apple.com> wrote:

> Hi Ivan,
>
> I saw a bot failure on your job after this commit:
>
>   http://lab.llvm.org:8011/builders/sanitizer-x86_64-
> linux-autoconf/builds/5467/steps/tsan%20analyze/logs/stdio
>   http://lab.llvm.org:8011/builders/sanitizer-x86_64-
> linux-autoconf/builds/5467/steps/build%20release%20tsan%
> 20with%20clang/logs/stdio
>
> However, I cannot reproduce it locally with a stage2 TSAN build.
>
> After staring at my diff I couldn't find anything that would explain the
> failure. No other bots seem upset.
>
> Do you have any idea about what's going on? Let me know if you want me to
> revert...
>
> vedant
>
> > On Feb 27, 2017, at 11:46 AM, Vedant Kumar via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
> >
> > Author: vedantk
> > Date: Mon Feb 27 13:46:19 2017
> > New Revision: 296374
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=296374&view=rev
> > Log:
> > [ubsan] Factor out logic to emit a range check. NFC.
> >
> > This is a readability improvement, but it will also help prep an
> > upcoming patch to detect UB loads from bitfields.
> >
> > Modified:
> >    cfe/trunk/lib/CodeGen/CGExpr.cpp
> >    cfe/trunk/lib/CodeGen/CodeGenFunction.h
> >
> > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CGExpr.cpp?rev=296374&r1=296373&r2=296374&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Feb 27 13:46:19 2017
> > @@ -1301,6 +1301,46 @@ llvm::MDNode *CodeGenFunction::getRangeF
> >   return MDHelper.createRange(Min, End);
> > }
> >
> > +bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value,
> QualType Ty,
> > +                                           SourceLocation Loc) {
> > +  bool HasBoolCheck = SanOpts.has(SanitizerKind::Bool);
> > +  bool HasEnumCheck = SanOpts.has(SanitizerKind::Enum);
> > +  if (!HasBoolCheck && !HasEnumCheck)
> > +    return false;
> > +
> > +  bool IsBool = hasBooleanRepresentation(Ty) ||
> > +                NSAPI(CGM.getContext()).isObjCBOOLType(Ty);
> > +  bool NeedsBoolCheck = HasBoolCheck && IsBool;
> > +  bool NeedsEnumCheck = HasEnumCheck && Ty->getAs<EnumType>();
> > +  if (!NeedsBoolCheck && !NeedsEnumCheck)
> > +    return false;
> > +
> > +  llvm::APInt Min, End;
> > +  if (!getRangeForType(*this, Ty, Min, End, /*StrictEnums=*/true,
> IsBool))
> > +    return true;
> > +
> > +  SanitizerScope SanScope(this);
> > +  llvm::Value *Check;
> > +  --End;
> > +  if (!Min) {
> > +    Check = Builder.CreateICmpULE(
> > +        Value, llvm::ConstantInt::get(getLLVMContext(), End));
> > +  } else {
> > +    llvm::Value *Upper = Builder.CreateICmpSLE(
> > +        Value, llvm::ConstantInt::get(getLLVMContext(), End));
> > +    llvm::Value *Lower = Builder.CreateICmpSGE(
> > +        Value, llvm::ConstantInt::get(getLLVMContext(), Min));
> > +    Check = Builder.CreateAnd(Upper, Lower);
> > +  }
> > +  llvm::Constant *StaticArgs[] = {EmitCheckSourceLocation(Loc),
> > +                                  EmitCheckTypeDescriptor(Ty)};
> > +  SanitizerMask Kind =
> > +      NeedsEnumCheck ? SanitizerKind::Enum : SanitizerKind::Bool;
> > +  EmitCheck(std::make_pair(Check, Kind), SanitizerHandler::
> LoadInvalidValue,
> > +            StaticArgs, EmitCheckValue(Value));
> > +  return true;
> > +}
> > +
> > llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool
> Volatile,
> >                                                QualType Ty,
> >                                                SourceLocation Loc,
> > @@ -1353,35 +1393,9 @@ llvm::Value *CodeGenFunction::EmitLoadOf
> >                                       false /*ConvertTypeToTag*/);
> >   }
> >
> > -  bool IsBool = hasBooleanRepresentation(Ty) ||
> > -                NSAPI(CGM.getContext()).isObjCBOOLType(Ty);
> > -  bool NeedsBoolCheck = SanOpts.has(SanitizerKind::Bool) && IsBool;
> > -  bool NeedsEnumCheck =
> > -      SanOpts.has(SanitizerKind::Enum) && Ty->getAs<EnumType>();
> > -  if (NeedsBoolCheck || NeedsEnumCheck) {
> > -    SanitizerScope SanScope(this);
> > -    llvm::APInt Min, End;
> > -    if (getRangeForType(*this, Ty, Min, End, /*StrictEnums=*/true,
> IsBool)) {
> > -      --End;
> > -      llvm::Value *Check;
> > -      if (!Min)
> > -        Check = Builder.CreateICmpULE(
> > -          Load, llvm::ConstantInt::get(getLLVMContext(), End));
> > -      else {
> > -        llvm::Value *Upper = Builder.CreateICmpSLE(
> > -          Load, llvm::ConstantInt::get(getLLVMContext(), End));
> > -        llvm::Value *Lower = Builder.CreateICmpSGE(
> > -          Load, llvm::ConstantInt::get(getLLVMContext(), Min));
> > -        Check = Builder.CreateAnd(Upper, Lower);
> > -      }
> > -      llvm::Constant *StaticArgs[] = {
> > -        EmitCheckSourceLocation(Loc),
> > -        EmitCheckTypeDescriptor(Ty)
> > -      };
> > -      SanitizerMask Kind = NeedsEnumCheck ? SanitizerKind::Enum :
> SanitizerKind::Bool;
> > -      EmitCheck(std::make_pair(Check, Kind), SanitizerHandler::
> LoadInvalidValue,
> > -                StaticArgs, EmitCheckValue(Load));
> > -    }
> > +  if (EmitScalarRangeCheck(Load, Ty, Loc)) {
> > +    // In order to prevent the optimizer from throwing away the check,
> don't
> > +    // attach range metadata to the load.
> >   } else if (CGM.getCodeGenOpts().OptimizationLevel > 0)
> >     if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
> >       Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
> >
> > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenFunction.h?rev=296374&r1=296373&r2=296374&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Feb 27 13:46:19 2017
> > @@ -2866,6 +2866,13 @@ public:
> >   /// representation to its value representation.
> >   llvm::Value *EmitFromMemory(llvm::Value *Value, QualType Ty);
> >
> > +  /// Check if the scalar \p Value is within the valid range for the
> given
> > +  /// type \p Ty.
> > +  ///
> > +  /// Returns true if a check is needed (even if the range is unknown).
> > +  bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
> > +                            SourceLocation Loc);
> > +
> >   /// EmitLoadOfScalar - Load a scalar value from an address, taking
> >   /// care to appropriately convert from the memory representation to
> >   /// the LLVM value representation.
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170227/ba59a453/attachment-0001.html>


More information about the cfe-commits mailing list