RT,为什么这份代码在开了fsanitize=address,undefined之后会抽风:
AddressSanitizer:DEADLYSIGNAL
==========================================
==4119==ERROR: AddressSanitizer: stack-overflow on address 0x00016ccefa20 (pc 0x00010259b670 bp 0x000102c890f4 sp 0x00016ccefa00 T0)
#0 0x10259b670 in main+0x78 (a:arm64+0x100003670)
SUMMARY: AddressSanitizer: stack-overflow (a:arm64+0x100003670) in main+0x78
==4119==ABORTING
不开sanitize时一切正常
code:
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define For(i,j,k) for(int i=(j); i<=(k); ++i)
#define ForDown(i,j,k) for(int i=(j); i>=(k); --i)
template<typename T>
il void read(T &x)
{
char c=getchar();
int mul=1;
while(!isdigit(c)) {if(c=='-')mul=-1;c=getchar();}
x=0;
while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
x*=mul;
}
int mod;
struct M
{
int a[1001][1001],n;
M(int __n=0) : n(__n) {memset(a,0,sizeof(a));}
il void raw()
{
For(i,1,n) a[i][i]=1;
}
};
int n,m;
M F(M x)
{
M res=x.n;
For(i,1,n)
For(j,1,n)
{
For(p,1,n)
res.a[i][j]=(res.a[i][j]+x.a[i][p])%mod;
For(p,1,n)
res.a[i][j]=(res.a[i][j]+x.a[p][j])%mod;
}
return res;
}
M p;
signed main()
{
// cerr<<"aaa\n";
read(n),read(m),read(mod);
p=n;
For(i,1,n) For(j,1,n) read(p.a[i][j]);
while(m--){
p=F(p);
}
For(i,1,n){
For(j,1,n)
printf("%d ",p.a[i][j]);
puts("");
}
//cout<<"Hello world.";
return 0;
}
environment
g++ a.cpp -o a -O2 -lm -std=c++17 -fsanitize=address,undefined && open a