[clang] [Clang] Don't crash if input file is not a module. (PR #98439)
Dmitriy Chestnykh via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 10 23:55:52 PDT 2024
https://github.com/chestnykh created https://github.com/llvm/llvm-project/pull/98439
Currently clang crashes with `-module-file-info` and input file which is not a module
Emit error instead of segfaulting.
Fix #98365
>From 716e8b7b71422b5850d2f9c3710a28bcf18ffccb Mon Sep 17 00:00:00 2001
From: Dmitry Chestnykh <dm.chestnykh at gmail.com>
Date: Thu, 11 Jul 2024 09:55:55 +0300
Subject: [PATCH] [Clang] Don't crash if input file is not a module.
Currently clang crashes with `-module-file-info` and input file
which is not a module
Emit error instead of segfaulting.
Fix #98365
---
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 1 +
clang/lib/Frontend/FrontendActions.cpp | 10 ++++++++--
clang/test/Frontend/module-file-info-not-a-module.c | 3 +++
3 files changed, 12 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Frontend/module-file-info-not-a-module.c
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 85c32e55bdab3..029ae6457699e 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -226,6 +226,7 @@ def err_module_map_not_found : Error<"module map file '%0' not found">,
def err_missing_module_name : Error<
"no module name provided; specify one with -fmodule-name=">,
DefaultFatal;
+def err_file_is_not_module : Error<"file '%0' is not a module">, DefaultFatal;
def err_missing_module : Error<
"no module named '%0' declared in module map file '%1'">, DefaultFatal;
def err_no_submodule : Error<"no submodule named %0 in module '%1'">;
diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index 4f064321997a2..ddefa07569c55 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -841,9 +841,15 @@ static StringRef ModuleKindName(Module::ModuleKind MK) {
}
void DumpModuleInfoAction::ExecuteAction() {
- assert(isCurrentFileAST() && "dumping non-AST?");
- // Set up the output file.
CompilerInstance &CI = getCompilerInstance();
+
+ // Don't process files of type other than module to avoid crash
+ if (!isCurrentFileAST()) {
+ CI.getDiagnostics().Report(diag::err_file_is_not_module) << getCurrentFile();
+ return;
+ }
+
+ // Set up the output file.
StringRef OutputFileName = CI.getFrontendOpts().OutputFile;
if (!OutputFileName.empty() && OutputFileName != "-") {
std::error_code EC;
diff --git a/clang/test/Frontend/module-file-info-not-a-module.c b/clang/test/Frontend/module-file-info-not-a-module.c
new file mode 100644
index 0000000000000..67eba2a27051b
--- /dev/null
+++ b/clang/test/Frontend/module-file-info-not-a-module.c
@@ -0,0 +1,3 @@
+// RUN: not %clang_cc1 -module-file-info %s 2>&1 | FileCheck %s
+
+// CHECK: fatal error: file '{{.*}}module-file-info-not-a-module.c' is not a module
More information about the cfe-commits
mailing list