[flang] Crash more gracefully when files include themselves.
authorpeter klausler <pklausler@nvidia.com>
Fri, 6 Apr 2018 21:20:29 +0000 (14:20 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 9 Apr 2018 20:49:23 +0000 (13:49 -0700)
Original-commit: flang-compiler/f18@6da9ec422824b7e86b10bb368fedd5b734063ce8
Reviewed-on: https://github.com/flang-compiler/f18/pull/48
Tree-same-pre-rewrite: false

flang/lib/parser/prescan.cc
flang/lib/parser/prescan.h

index b3132e1..0f9b154 100644 (file)
@@ -14,6 +14,8 @@
 namespace Fortran {
 namespace parser {
 
+static constexpr int maxPrescannerNesting{100};
+
 Prescanner::Prescanner(
     Messages &messages, CookedSource &cooked, Preprocessor &preprocessor)
   : messages_{messages}, cooked_{cooked}, preprocessor_{preprocessor} {}
@@ -26,6 +28,7 @@ Prescanner::Prescanner(const Prescanner &that)
     enableBackslashEscapesInCharLiterals_{
         that.enableBackslashEscapesInCharLiterals_},
     warnOnNonstandardUsage_{that.warnOnNonstandardUsage_},
+    prescannerNesting_{that.prescannerNesting_ + 1},
     compilerDirectiveBloomFilter_{that.compilerDirectiveBloomFilter_},
     compilerDirectiveSentinels_{that.compilerDirectiveSentinels_} {}
 
@@ -53,6 +56,11 @@ void Prescanner::Prescan(ProvenanceRange range) {
   limit_ = start_ + range.size();
   lineStart_ = start_;
   const bool beganInFixedForm{inFixedForm_};
+  if (prescannerNesting_ > maxPrescannerNesting) {
+    Say("too many nested INCLUDE/#include files, possibly circular"_err_en_US,
+        GetProvenance(start_));
+    return;
+  }
   while (lineStart_ < limit_) {
     Statement();
   }
index 81953c4..d96c013 100644 (file)
@@ -156,6 +156,7 @@ private:
   bool enableBackslashEscapesInCharLiterals_{true};
   bool warnOnNonstandardUsage_{false};
   int delimiterNesting_{0};
+  int prescannerNesting_{0};
 
   Provenance startProvenance_;
   const char *start_{nullptr};  // beginning of current source file content