[flang-commits] [PATCH] D140146: [flang] Impose DATA initialization size limit to avoid crashing
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu Dec 15 11:49:55 PST 2022
klausler created this revision.
klausler added a reviewer: vdonaldson.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Impose a large but finite limit on the size of a variable being
initialized in a DATA statement to provide a readable error message
for artificial test cases that's better than a memory allocation
failure crash.
https://reviews.llvm.org/D140146
Files:
flang/lib/Semantics/data-to-inits.cpp
flang/lib/Semantics/expression.cpp
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -2093,6 +2093,11 @@
if (dataRef && !CheckDataRef(*dataRef)) {
return std::nullopt;
}
+ if (dataRef && dataRef->Rank() > 0 && sym->attrs().test(semantics::Attr::NOPASS)) {
+ // C1529 seems unnecessary and most compilers don't enforce it.
+ Say(sc.component.source,
+ "Base of procedure component reference should be scalar when NOPASS component or binding '%s' is referenced"_port_en_US, sc.component.source);
+ }
if (const Symbol *resolution{
GetBindingResolution(dtExpr->GetType(), *sym)}) {
AddPassArg(arguments, std::move(*dtExpr), *sym, false);
Index: flang/lib/Semantics/data-to-inits.cpp
===================================================================
--- flang/lib/Semantics/data-to-inits.cpp
+++ flang/lib/Semantics/data-to-inits.cpp
@@ -30,6 +30,11 @@
// objects and pointers.
static constexpr bool removeOriginalInits{false};
+// Impose a hard limit that's more than large enough for real applications but
+// small enough to cause artificial stress tests to fail reasonably instead of
+// crashing the compiler with a memory allocation failure.
+static constexpr auto maxDataInitBytes{std::size_t{1000000000}}; // 1GiB
+
namespace Fortran::semantics {
// Steps through a list of values in a DATA statement set; implements
@@ -356,6 +361,13 @@
const SomeExpr *expr{*values_};
if (!expr) {
CHECK(exprAnalyzer_.context().AnyFatalError());
+ } else if (symbol.size() > maxDataInitBytes) {
+ evaluate::AttachDeclaration(
+ exprAnalyzer_.context().Say(
+ "'%s' is too large to initialize with a DATA statement"_todo_en_US,
+ symbol.name()),
+ symbol);
+ return false;
} else if (isPointer) {
if (static_cast<std::size_t>(offsetSymbol.offset() + offsetSymbol.size()) >
symbol.size()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140146.483278.patch
Type: text/x-patch
Size: 2073 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20221215/4df6404f/attachment-0001.bin>
More information about the flang-commits
mailing list