On 12/18/2017 03:05 PM, Richard Smith wrote:
Can we just strip the noexcept from the function type before emitting the fsan type info?

As is apparently already done when emitting the (not noexcept-annotated) __cxxabiv1::__function_type_info referenced from a noexcept-annotated __cxxabiv1::__pointer_type_info?

That would indeed look like a better way to address this, then. But wouldn't that also prevent -fsanitize=function from finding mismatches where a non-noexcept function is called through a noexcept pointer, as in

  void f() {}
  void g(void (*p)() noexcept) { p(); }
  int main() { g(reinterpret_cast<void (*)() noexcept>(f)); }

On 18 Dec 2017 13:52, "Stephan Bergmann via cfe-commits" <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    Author: sberg
    Date: Mon Dec 18 05:51:48 2017
    New Revision: 320982

    URL: http://llvm.org/viewvc/llvm-project?rev=320982&view=rev
    <http://llvm.org/viewvc/llvm-project?rev=320982&view=rev>
    Log:
    Revert r320978 "No -fsanitize=function warning when calling noexcept
    function through non-noexcept pointer in C++17"

    At least
    <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/
    builds/6013/steps/annotate/logs/stdio
    <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/
    builds/6013/steps/annotate/logs/stdio>> complains about
    __ubsan::__ubsan_handle_function_type_mismatch_abort (compiler-rt
    lib/ubsan/ubsan_handlers.cc) returning now despite being declared
    'noreturn', so
    looks like a different approach is needed for the
    function_type_mismatch check
    to be called also in cases that may ultimately succeed.

    Modified:
         cfe/trunk/lib/CodeGen/CGExpr.cpp

    Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=320982&r1=320981&r2=320982&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=320982&r1=320981&r2=320982&view=diff>
    
==============================================================================
    --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
    +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Dec 18 05:51:48 2017
    @@ -4504,14 +4504,10 @@ RValue CodeGenFunction::EmitCall(QualTyp
                Builder.CreateICmpEQ(CalleeRTTI, FTRTTIConst);
            llvm::Constant *StaticData[] = {
              EmitCheckSourceLocation(E->getLocStart()),
    -        EmitCheckTypeDescriptor(CalleeType),
    -        cast<FunctionProtoType>(FnType)->isNothrow(getContext())
    -          ? llvm::Constant::getNullValue(FTRTTIConst->getType())
    -          : FTRTTIConst
    +        EmitCheckTypeDescriptor(CalleeType)
            };
            EmitCheck(std::make_pair(CalleeRTTIMatch,
    SanitizerKind::Function),
    -                SanitizerHandler::FunctionTypeMismatch, StaticData,
    -                {CalleePtr, CalleeRTTI});
    +                SanitizerHandler::FunctionTypeMismatch, StaticData,
    CalleePtr);

            Builder.CreateBr(Cont);
            EmitBlock(Cont);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to