[llvm-bugs] [Bug 43946] New: Invocation of memset with incorrect number of arguments results in segfault

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Nov 8 09:08:12 PST 2019


https://bugs.llvm.org/show_bug.cgi?id=43946

            Bug ID: 43946
           Summary: Invocation of memset with incorrect number of
                    arguments results in segfault
           Product: clang
           Version: 9.0
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C
          Assignee: unassignedclangbugs at nondot.org
          Reporter: mprice at synopsys.com
                CC: blitzrakete at gmail.com, dgregor at apple.com,
                    erik.pilkington at gmail.com, llvm-bugs at lists.llvm.org,
                    richard-llvm at metafoo.co.uk

As a part of testing our product that is based on Clang, we run our tool
against many packages that ship as a part of the Debian Linux distribution.

We recently upgraded our tool to be based off of Clang 9, and our Debian
package tests exposed a segfault.

There are a handful of packages [see Threaded USENET news reader (trn4,
https://packages.debian.org/jessie/trn4) as well as the PennMUSH virtual world
server (pennmush 1.8.2p8-1.1, https://packages.debian.org/jessie/pennmush)]
that use a bash script to configure the build process. Part of this is probing
the compiler to see what features are available. As a part of that probing, it
attempts to compile a source code that is similar to:

int main () {
    extern void memset();
    memset();
}

This compiles fine in Clang 8, but in Clang 9 it causes a segfault. The issue
appears to be in the the function
`clang::Sema::checkFortifiedBuiltinMemoryFunction`. I suspect it's not prepared
to handle such an unexpected call to `memset`. My understanding is that this
function is intended to emit a runtime diagnostic letting the user that they've
misused this C library function.

Here is a Compiler Explorer link showing the source, and the differences
between Clang 8 and Clang 9 behavior. https://c.godbolt.org/z/7dJxjJ

The output that Clang 9 shows is:

==========================================================================

<source>:2:17: warning: incompatible redeclaration of library function 'memset'
[-Wincompatible-library-redeclaration]

    extern void memset();

                ^

<source>:2:17: note: 'memset' is a builtin with type 'void *(void *, int,
unsigned long)'

Stack dump:

0.      Program arguments: /opt/compiler-explorer/clang-9.0.0/bin/clang-9 -cc1
-triple x86_64-unknown-linux-gnu -fsyntax-only -disable-free
-disable-llvm-verifier -discard-value-names -main-file-name example.c
-mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno
-masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array
-target-cpu x86-64 -dwarf-column-info -debug-info-kind=limited -dwarf-version=4
-debugger-tuning=gdb -resource-dir
/opt/compiler-explorer/clang-9.0.0/lib/clang/9.0.0 -internal-isystem
/usr/local/include -internal-isystem
/opt/compiler-explorer/clang-9.0.0/lib/clang/9.0.0/include
-internal-externc-isystem /usr/include/x86_64-linux-gnu
-internal-externc-isystem /include -internal-externc-isystem /usr/include
-fdebug-compilation-dir /home/ubuntu -ferror-limit 19 -fmessage-length 0
-fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -mllvm
--x86-asm-syntax=intel -faddrsig -x c <source> 

1.      <source>:3:12: current parser token ')'

2.      <source>:1:13: parsing function body 'main'

3.      <source>:1:13: in compound statement ('{}')

 #0 0x000055cdbf2c476a llvm::sys::PrintStackTrace(llvm::raw_ostream&)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x27db76a)

 #1 0x000055cdbf2c2524 llvm::sys::RunSignalHandlers()
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x27d9524)

 #2 0x000055cdbf2c2662 SignalHandler(int)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x27d9662)

 #3 0x00007f57ca88a890 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x12890)

 #4 0x000055cdc092fc8e
clang::Sema::checkFortifiedBuiltinMemoryFunction(clang::FunctionDecl*,
clang::CallExpr*) (/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3e46c8e)

 #5 0x000055cdc0b61377 clang::Sema::BuildResolvedCallExpr(clang::Expr*,
clang::NamedDecl*, clang::SourceLocation, llvm::ArrayRef<clang::Expr*>,
clang::SourceLocation, clang::Expr*, bool, clang::CallExpr::ADLCallKind)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x4078377)

 #6 0x000055cdc0b61e7e clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*,
clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>,
clang::SourceLocation, clang::Expr*, bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x4078e7e)

 #7 0x000055cdc0b631f2 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*,
clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>,
clang::SourceLocation, clang::Expr*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x407a1f2)

 #8 0x000055cdc083d13f
clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*,
true>) (/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d5413f)

 #9 0x000055cdc0837e0f clang::Parser::ParseCastExpression(bool, bool, bool&,
clang::Parser::TypeCastState, bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d4ee0f)

#10 0x000055cdc083a2f4 clang::Parser::ParseCastExpression(bool, bool,
clang::Parser::TypeCastState, bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d512f4)

#11 0x000055cdc083b4b1
clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d524b1)

#12 0x000055cdc083c129
clang::Parser::ParseExpression(clang::Parser::TypeCastState)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d53129)

#13 0x000055cdc088501d
clang::Parser::ParseExprStatement(clang::Parser::ParsedStmtContext)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d9c01d)

#14 0x000055cdc08829b2
clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*,
clang::Parser::ParsedAttributesWithRange&)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d999b2)

#15 0x000055cdc0884209
clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d9b209)

#16 0x000055cdc0887831 clang::Parser::ParseCompoundStatementBody(bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d9e831)

#17 0x000055cdc088a8f3 clang::Parser::ParseFunctionStatementBody(clang::Decl*,
clang::Parser::ParseScope&)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3da18f3)

#18 0x000055cdc07f7578
clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&,
clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d0e578)

#19 0x000055cdc0817d81 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&,
clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d2ed81)

#20 0x000055cdc07f24c9
clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec&, clang::AccessSpecifier)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d094c9)

#21 0x000055cdc07f31a1
clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.207)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d0a1a1)

#22 0x000055cdc07fa416
clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d11416)

#23 0x000055cdc07fae79
clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d11e79)

#24 0x000055cdc07fb3a5
clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d123a5)

#25 0x000055cdc07eec36 clang::ParseAST(clang::Sema&, bool, bool)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x3d05c36)

#26 0x000055cdbf995529 clang::FrontendAction::Execute()
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x2eac529)

#27 0x000055cdbf958bf5
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x2e6fbf5)

#28 0x000055cdbfa58f23
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0x2f6ff23)

#29 0x000055cdbd7f7140 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) (/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0xd0e140)

#30 0x000055cdbd755882 main
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0xc6c882)

#31 0x00007f57c9748b97 __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21b97)

#32 0x000055cdbd7f47fa _start
(/opt/compiler-explorer/clang-9.0.0/bin/clang-9+0xd0b7fa)

clang-9: error: unable to execute command: Segmentation fault (core dumped)

clang-9: error: clang frontend command failed due to signal (use -v to see
invocation)

Compiler returned: 254

==========================================================================

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20191108/efe1ca32/attachment-0001.html>


More information about the llvm-bugs mailing list