beet's soil

競プロのことなど

stack overflow 回避

まだ手元実行で消耗してるの?

はじめに

以下のコードを手元でコンパイルして実行してみてください

#include <bits/stdc++.h>
using namespace std;

const int LIM = 1e6+3;
int dfs(int x){
  if(x==LIM) return 1;
  if(x&1) return (dfs(x+1)+x)%LIM;
  return dfs(x+1)*(long long)x%LIM;
}

signed main(){
  cout<<dfs(1)<<endl;;
  return 0;
}

これは実行すると segmentation fault する人向けの記事です

なんぞこれ

1e6頂点とかのグラフに対してDFSするとセグフォして死ぬことがあります

多くのコンテストサイトではスタックサイズが(実質)無限なので気にする必要はあんまりないんですが、FHC のような手元で実行して結果を提出する形式の時に困ります(話が逸れるんですがO2つけ忘れたり-D_GLIBCXX_DEBUGをつけっぱなしにしていてTLEしたりもします)

以下では環境ごとの対策を挙げます

Ubuntu

ICPCは基本これでOK ジャカルタ?知らないRegionですね…

ulimit -s unlimited

Mac

コンパイルオプションを足す

alias g++='g++ -O2 -Wall -Wextra -Wl,-stack_size,0x10000000'

WSL

コンパイルオプションを足す  2020/08/06追記 オプション足りてませんでした(ア 2020/08/26追記 -fsplit-stack だけじゃないと動かない環境もあるみたいです(イ

alias g++='g++ -O2 -Wall -Wextra -fsplit-stack -Wl,-stack,0x10000000'

参考:

github.com

github.com