jiezhoucs/checkedc-clang

Pass an MMSafe pointer to a printf

Opened this issue · 0 comments

Currently if we pass an mmsafe pointer to printf, such as

mm_ptr<some_struct> p = ...;
printf("%d, %x\n", some_integer, p);

The compiler crashed because of some EXE_BAD_ACCESS error.
The stack trace would be like:

0  clang-8                  0x0000000103aa747a llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 58
1  clang-8                  0x0000000103aa79e9 PrintStackTraceSignalHandler(void*) + 25
2  clang-8                  0x0000000103aa518b llvm::sys::RunSignalHandlers() + 123
3  clang-8                  0x0000000103aad9bf SignalHandler(int) + 207
4  libsystem_platform.dylib 0x00007fff6a1eb5fd _sigtramp + 29
5  clang-8                  0x00000001017cf482 llvm::Twine::isNullary() const + 50
6  clang-8                  0x000000010374e5c5 llvm::Type::isStructTy() const + 21
7  clang-8                  0x0000000102c387fc llvm::Type::isMMPointerTy() const + 28
8  clang-8                  0x0000000102c3889c llvm::Type::isMMSafePointerTy() const + 28
9  clang-8                  0x000000010467a8fd llvm::IRBuilder<llvm::ConstantFolder, clang::CodeGen::CGBuilderInserter>::CreateCast(llvm::Instruction::CastOps, llvm::Value*, llvm::Type*, llvm::Twine const&) + 157
10 clang-8                  0x0000000104114cc2 llvm::IRBuilder<llvm::ConstantFolder, clang::CodeGen::CGBuilderInserter>::CreateBitCast(llvm::Value*, llvm::Type*, llvm::Twine const&) + 50
11 clang-8                  0x000000010412af5c clang::CodeGen::CodeGenFunction::EmitCall(clang::CodeGen::CGFunctionInfo const&, clang::CodeGen::CGCallee const&, clang::CodeGen::ReturnValueSlot, clang::CodeGen::CallArgList const&, llvm::Instruction**, clang::SourceLocation) + 10956
12 clang-8                  0x0000000104223d60 clang::CodeGen::CodeGenFunction::EmitCall(clang::QualType, clang::CodeGen::CGCallee const&, clang::CallExpr const*, clang::CodeGen::ReturnValueSlot, llvm::Value*) + 4608
13 clang-8                  0x00000001040795c5 emitLibraryCall(clang::CodeGen::CodeGenFunction&, clang::FunctionDecl const*, clang::CallExpr const*, llvm::Constant*) + 245
14 clang-8                  0x000000010407074b clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(clang::GlobalDecl, unsigned int, clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) + 73307
15 clang-8                  0x0000000104222503 clang::CodeGen::CodeGenFunction::EmitCallExpr(clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) + 611
16 clang-8                  0x0000000104291106 (anonymous namespace)::ScalarExprEmitter::VisitCallExpr(clang::CallExpr const*) + 166
17 clang-8                  0x000000010428bc92 clang::StmtVisitorBase<std::__1::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) + 3042
18 clang-8                  0x00000001042827eb (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) + 59
19 clang-8                  0x0000000104282768 clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) + 184
20 clang-8                  0x00000001041fe9bc clang::CodeGen::CodeGenFunction::EmitAnyExpr(clang::Expr const*, clang::CodeGen::AggValueSlot, bool) + 156
21 clang-8                  0x00000001041fe8ed clang::CodeGen::CodeGenFunction::EmitIgnoredExpr(clang::Expr const*) + 125
22 clang-8                  0x000000010442d934 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 708
23 clang-8                  0x0000000104438871 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 193
24 clang-8                  0x00000001044377d4 clang::CodeGen::CodeGenFunction::EmitCompoundStmt(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 276
25 clang-8                  0x000000010442e6a1 clang::CodeGen::CodeGenFunction::EmitSimpleStmt(clang::Stmt const*) + 321
26 clang-8                  0x000000010442d718 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 168
27 clang-8                  0x000000010442ed44 clang::CodeGen::CodeGenFunction::EmitIfStmt(clang::IfStmt const&) + 964
28 clang-8                  0x000000010442da29 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 953
29 clang-8                  0x0000000104438871 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 193
30 clang-8                  0x00000001044377d4 clang::CodeGen::CodeGenFunction::EmitCompoundStmt(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 276
31 clang-8                  0x000000010442e6a1 clang::CodeGen::CodeGenFunction::EmitSimpleStmt(clang::Stmt const*) + 321
32 clang-8                  0x000000010442d718 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 168
33 clang-8                  0x000000010442ed44 clang::CodeGen::CodeGenFunction::EmitIfStmt(clang::IfStmt const&) + 964
34 clang-8                  0x000000010442da29 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 953
35 clang-8                  0x0000000104438871 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 193
36 clang-8                  0x00000001044bc644 clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::Stmt const*) + 132
37 clang-8                  0x00000001044bd12c clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) + 1292
38 clang-8                  0x00000001044eca9b clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) + 651
39 clang-8                  0x00000001044e44a3 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) + 883
40 clang-8                  0x00000001044e98cf clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) + 1983
41 clang-8                  0x00000001044f1cf6 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) + 198
42 clang-8                  0x0000000104701fa2 (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) + 146
43 clang-8                  0x00000001044a2983 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) + 227
44 clang-8                  0x000000010708a89a clang::ParseAST(clang::Sema&, bool, bool) + 506
45 clang-8                  0x0000000104c82a42 clang::ASTFrontendAction::ExecuteAction() + 322
46 clang-8                  0x00000001044a1f1d clang::CodeGenAction::ExecuteAction() + 1389
47 clang-8                  0x0000000104c82073 clang::FrontendAction::Execute() + 115
48 clang-8                  0x0000000104ba5412 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1602
49 clang-8                  0x0000000104d55600 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 2064
50 clang-8                  0x00000001017db63d cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1117
51 clang-8                  0x00000001017ccedc ExecuteCC1Tool(llvm::ArrayRef<char const*>, llvm::StringRef) + 620
52 clang-8                  0x00000001017cb619 main + 3881
53 libdyld.dylib            0x00007fff69ff2cc9 start + 1
54 libdyld.dylib            0x0000000000000040 start + 2516636536

When printf has only one argument such as

printf("%x\n", p);

The dumped stack trace is like:

0  clang-8                  0x000000010cdb647a llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 58
1  clang-8                  0x000000010cdb69e9 PrintStackTraceSignalHandler(void*) + 25
2  clang-8                  0x000000010cdb418b llvm::sys::RunSignalHandlers() + 123
3  clang-8                  0x000000010cdbc9bf SignalHandler(int) + 207
4  libsystem_platform.dylib 0x00007fff6a1eb5fd _sigtramp + 29
5  clang-8                  0x0000000113034582 llvm::DenseMapInfo<llvm::codeview::GloballyHashedType>::Tombstone + 2360754
6  libsystem_c.dylib        0x00007fff6a0c1808 abort + 120
7  libsystem_c.dylib        0x00007fff6a0c0ac6 err + 0
8  clang-8                  0x000000010be3689d llvm::CastInst::Create(llvm::Instruction::CastOps, llvm::Value*, llvm::Type*, llvm::Twine const&, llvm::Instruction*) + 237
9  clang-8                  0x000000010d989984 llvm::IRBuilder<llvm::ConstantFolder, clang::CodeGen::CGBuilderInserter>::CreateCast(llvm::Instruction::CastOps, llvm::Value*, llvm::Type*, llvm::Twine const&) + 292
10 clang-8                  0x000000010d423cc2 llvm::IRBuilder<llvm::ConstantFolder, clang::CodeGen::CGBuilderInserter>::CreateBitCast(llvm::Value*, llvm::Type*, llvm::Twine const&) + 50
11 clang-8                  0x000000010d439f5c clang::CodeGen::CodeGenFunction::EmitCall(clang::CodeGen::CGFunctionInfo const&, clang::CodeGen::CGCallee const&, clang::CodeGen::ReturnValueSlot, clang::CodeGen::CallArgList const&, llvm::Instruction**, clang::SourceLocation) + 10956
12 clang-8                  0x000000010d532d60 clang::CodeGen::CodeGenFunction::EmitCall(clang::QualType, clang::CodeGen::CGCallee const&, clang::CallExpr const*, clang::CodeGen::ReturnValueSlot, llvm::Value*) + 4608
13 clang-8                  0x000000010d3885c5 emitLibraryCall(clang::CodeGen::CodeGenFunction&, clang::FunctionDecl const*, clang::CallExpr const*, llvm::Constant*) + 245
14 clang-8                  0x000000010d37f74b clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(clang::GlobalDecl, unsigned int, clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) + 73307
15 clang-8                  0x000000010d531503 clang::CodeGen::CodeGenFunction::EmitCallExpr(clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) + 611
16 clang-8                  0x000000010d5a0106 (anonymous namespace)::ScalarExprEmitter::VisitCallExpr(clang::CallExpr const*) + 166
17 clang-8                  0x000000010d59ac92 clang::StmtVisitorBase<std::__1::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) + 3042
18 clang-8                  0x000000010d5917eb (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) + 59
19 clang-8                  0x000000010d591768 clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) + 184
20 clang-8                  0x000000010d50d9bc clang::CodeGen::CodeGenFunction::EmitAnyExpr(clang::Expr const*, clang::CodeGen::AggValueSlot, bool) + 156
21 clang-8                  0x000000010d50d8ed clang::CodeGen::CodeGenFunction::EmitIgnoredExpr(clang::Expr const*) + 125
22 clang-8                  0x000000010d73c934 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) + 708
23 clang-8                  0x000000010d747871 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) + 193
24 clang-8                  0x000000010d7cb644 clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::Stmt const*) + 132
25 clang-8                  0x000000010d7cc12c clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) + 1292
26 clang-8                  0x000000010d7fba9b clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) + 651
27 clang-8                  0x000000010d7f34a3 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) + 883
28 clang-8                  0x000000010d7f88cf clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) + 1983
29 clang-8                  0x000000010d800cf6 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) + 198
30 clang-8                  0x000000010da10fa2 (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) + 146
31 clang-8                  0x000000010d7b1983 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) + 227
32 clang-8                  0x000000011039989a clang::ParseAST(clang::Sema&, bool, bool) + 506
33 clang-8                  0x000000010df91a42 clang::ASTFrontendAction::ExecuteAction() + 322
34 clang-8                  0x000000010d7b0f1d clang::CodeGenAction::ExecuteAction() + 1389
35 clang-8                  0x000000010df91073 clang::FrontendAction::Execute() + 115
36 clang-8                  0x000000010deb4412 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1602
37 clang-8                  0x000000010e064600 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 2064
38 clang-8                  0x000000010aaea63d cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1117
39 clang-8                  0x000000010aadbedc ExecuteCC1Tool(llvm::ArrayRef<char const*>, llvm::StringRef) + 620
40 clang-8                  0x000000010aada619 main + 3881
41 libdyld.dylib            0x00007fff69ff2cc9 start + 1
42 libdyld.dylib            0x0000000000000037 start + 2516636527