llvm / llvm/llvm-project

[BUG] ICE in clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*)

Open
#204,752 1 comment 0 reactions 0 assignees View on GitHub
clang:codegen crash-on-invalid generated by fuzzer
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

## Bug Report: ICE in clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*)

Clang crashes when compiling the following C code.

**Compiler**: clang-22 (LLVM 22.1.5, commit 5ea218a153f4d2f815b8244eab3e4b4ba5e00e6c)
**Compilation flags**: -O0
**Platform**: x86_64-linux-gnu
**Component**: frontend

This is a **frontend** crash (reproduces with `-emit-llvm -Xclang -disable-llvm-passes`).

## Reduced Test Case

> Minimized from the original fuzzer-generated input using `creduce`.

```sh
clang -O0 test.c -o /dev/null
```

```c
#pragma redefine_extname a b
a();
*b = a;

```

## Crash Output

```
clang-22: /root/compilers/llvm-project-release/llvm/include/llvm/IR/ValueHandle.h:337: ValueTy* llvm::TrackingVH::getValPtr() const [with ValueTy \= llvm::Constant]: Assertion \`InnerHandle.pointsToAliveValue() && "TrackingVH must be non-null and valid on dereference!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0\. Program arguments: /root/objects/llvm-project-release.obj/bin/clang-22 -cc1 -triple x86_64-unknown-linux-gnu -O0 -emit-obj -dumpdir /dev/null- -disable-free -clear-ast-before-backend -main-file-name iakFFVvKoNzI_surfuzz_29.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/data -fcoverage-compilation-dir=/root/data -resource-dir /root/objects/llvm-project-release.obj/lib/clang/22 -internal-isystem /root/objects/llvm-project-release.obj/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -faddrsig -fdwarf2-cfi-asm -o /tmp/iakFFVvKoNzI_surfuzz_29-518881.o -x c /root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c
1\. /root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c:5:1: current parser token 'int'
2\. /root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c:4:7: LLVM IR generation of declaration 'real'
3\. /root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c:4:7: Generating code for declaration 'real'
#0 0x00005607736052d2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/root/objects/llvm-project-release.obj/bin/clang-22+0x44f62d2)
#1 0x0000560773601caf llvm::sys::RunSignalHandlers() (/root/objects/llvm-project-release.obj/bin/clang-22+0x44f2caf)
#2 0x0000560773601dfc SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x00007f9c3fad8520 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00007f9c3fb2ca7c __pthread_kill_implementation ./nptl/./nptl/pthread_kill.c:44:76
#5 0x00007f9c3fb2ca7c __pthread_kill_internal ./nptl/./nptl/pthread_kill.c:78:10
#6 0x00007f9c3fb2ca7c pthread_kill ./nptl/./nptl/pthread_kill.c:89:10
#7 0x00007f9c3fad8476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007f9c3fabe7f3 abort ./stdlib/./stdlib/abort.c:81:7
#9 0x00007f9c3fabe71b _nl_load_domain ./intl/./intl/loadmsgcat.c:1177:9
#10 0x00007f9c3facfe96 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#11 0x0000560773bba2d7 llvm::TrackingVH::getValPtr() const (/root/objects/llvm-project-release.obj/bin/clang-22+0x4aab2d7)
#12 0x0000560773bd8acd clang::CodeGen::CodeGenModule::EmitGlobalVarDefinition(clang::VarDecl const*, bool) (/root/objects/llvm-project-release.obj/bin/clang-22+0x4ac9acd)
#13 0x0000560773bf2e99 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/root/objects/llvm-project-release.obj/bin/clang-22+0x4ae3e99)
#14 0x0000560773bf3b83 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) (/root/objects/llvm-project-release.obj/bin/clang-22+0x4ae4b83)
#15 0x0000560773bfe3df clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) (.part.0) CodeGenModule.cpp:0:0
#16 0x0000560773f79d71 (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) ModuleBuilder.cpp:0:0
#17 0x0000560773f6acc1 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) (/root/objects/llvm-project-release.obj/bin/clang-22+0x4e5bcc1)
#18 0x0000560775e16874 clang::ParseAST(clang::Sema&, bool, bool) (/root/objects/llvm-project-release.obj/bin/clang-22+0x6d07874)
#19 0x000056077428e987 clang::FrontendAction::Execute() (/root/objects/llvm-project-release.obj/bin/clang-22+0x517f987)
#20 0x00005607742160e9 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/root/objects/llvm-project-release.obj/bin/clang-22+0x51070e9)
#21 0x000056077438b95e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/root/objects/llvm-project-release.obj/bin/clang-22+0x527c95e)
#22 0x0000560770096657 cc1_main(llvm::ArrayRef, char const*, void*) (/root/objects/llvm-project-release.obj/bin/clang-22+0xf87657)
#23 0x000056077008b694 ExecuteCC1Tool(llvm::SmallVectorImpl&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr) driver.cpp:0:0
#24 0x0000560770090907 clang_main(int, char**, llvm::ToolContext const&) (/root/objects/llvm-project-release.obj/bin/clang-22+0xf81907)
#25 0x000056076ff4e0ea main (/root/objects/llvm-project-release.obj/bin/clang-22+0xe3f0ea)
#26 0x00007f9c3fabfd90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#27 0x00007f9c3fabfe40 call_init ./csu/../csu/libc-start.c:128:20
#28 0x00007f9c3fabfe40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#29 0x000056077008acb5 _start (/root/objects/llvm-project-release.obj/bin/clang-22+0xf7bcb5)
clang: error: unable to execute command: Aborted (core dumped)
clang: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 22.1.5 (https://github.com/llvm/llvm-project.git 5ea218a153f4d2f815b8244eab3e4b4ba5e00e6c)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /root/objects/llvm-project-release.obj/bin
Build config: \+assertions
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/iakFFVvKoNzI_surfuzz_29-0df77b.c
clang: note: diagnostic msg: /tmp/iakFFVvKoNzI_surfuzz_29-0df77b.sh
clang: note: diagnostic msg:
********************
EXIT_CODE: 1
```

## Preprocessed Source & Run Script

**Preprocessed source** (`/tmp/iakFFVvKoNzI_surfuzz_29-0df77b.c`):

```c
# 1 ""
# 1 "/root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c"
#pragma redefine_extname fake real
#pragma redefine_extname name alias
extern int fake(void);
int (*real)(void) = fake;
int bar(void) { return fake(); }
int name(void) { return alias(); }
extern int name(void);
int fish(void) { return fake() + __PRAGMA_REDEFINE_EXTNAME + name; }
#pragma redefine_extname foo bar
int f(void) {
int foo = 0;
return foo;
}
extern int foo(void) { return 1; }
#pragma redefine_extname foo_static bar_static
static int foo_static(void) { return 1; }
int baz(void) { return foo_static(); }
typedef unsigned long size_t;
extern void *memcpy(void *, const void *, size_t);
#pragma redefine_extname memcpy __GI_memcpy
void *test_memcpy(void *dst, const void *src, size_t n) { return memcpy(dst, src, n); }

```

**Run script** (`/tmp/iakFFVvKoNzI_surfuzz_29-0df77b.sh`):

```sh
# Crash reproducer for clang version 22.1.5 (https://github.com/llvm/llvm-project.git 5ea218a153f4d2f815b8244eab3e4b4ba5e00e6c)
# Driver args: "-O0" "/root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c" "-o" "/dev/null"
# Original command: "/root/objects/llvm-project-release.obj/bin/clang-22" "-cc1" "-triple" "x86_64-unknown-linux-gnu" "-O0" "-emit-obj" "-dumpdir" "/dev/null-" "-disable-free" "-clear-ast-before-backend" "-main-file-name" "iakFFVvKoNzI_surfuzz_29.c" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-mframe-pointer=all" "-fmath-errno" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-funwind-tables=2" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-debugger-tuning=gdb" "-fdebug-compilation-dir=/root/data" "-fcoverage-compilation-dir=/root/data" "-resource-dir" "/root/objects/llvm-project-release.obj/lib/clang/22" "-internal-isystem" "/root/objects/llvm-project-release.obj/lib/clang/22/include" "-internal-isystem" "/usr/local/include" "-internal-isystem" "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include" "-internal-externc-isystem" "/usr/include/x86_64-linux-gnu" "-internal-externc-isystem" "/include" "-internal-externc-isystem" "/usr/include" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-fskip-odr-check-in-gmf" "-faddrsig" "-fdwarf2-cfi-asm" "-o" "/tmp/iakFFVvKoNzI_surfuzz_29-518881.o" "-x" "c" "/root/outputs/experiments-on-metamut/surfuzz,clang,0/iakFFVvKoNzI_surfuzz_29.c"
"/root/objects/llvm-project-release.obj/bin/clang-22" "-cc1" "-triple" "x86_64-unknown-linux-gnu" "-O0" "-emit-obj" "-dumpdir" "/dev/null-" "-disable-free" "-clear-ast-before-backend" "-main-file-name" "iakFFVvKoNzI_surfuzz_29.c" "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" "-mframe-pointer=all" "-fmath-errno" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-funwind-tables=2" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-debugger-tuning=gdb" "-fdebug-compilation-dir=/root/data" "-fcoverage-compilation-dir=/root/data" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-fskip-odr-check-in-gmf" "-faddrsig" "-fdwarf2-cfi-asm" "-x" "c" "iakFFVvKoNzI_surfuzz_29-0df77b.c"

```

* found via a fuzzer

[iakFFVvKoNzI_surfuzz_29-0df77b.c](https://github.com/user-attachments/files/29127993/iakFFVvKoNzI_surfuzz_29-0df77b.c)
[iakFFVvKoNzI_surfuzz_29-0df77b.sh](https://github.com/user-attachments/files/29127994/iakFFVvKoNzI_surfuzz_29-0df77b.sh)

Contributor guide

Open the contributing guide

Research direction

Run the reduced C reproducer and the attached run script first to confirm the assertion in clang::CodeGen::CodeGenModule::EmitGlobalVarDefinition. Then inspect the CodeGenModule.cpp path shown in the stack trace, especially EmitGlobalVarDefinition and EmitGlobalVarDefinition's handling of the affected global. Done means the reproducer no longer crashes during frontend code generation.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.