.include common

static_sized_buffer( buf:node, size:number )
bad_bound( c:node, i:node, s:number )

static_sized_buffer( buffer, size ) :- \
  varD(var), \
  iname(iname,_,buffer,t), \
  parent(var,iname), \
  arrayT(t,_,sE), \
  intL( sE,size).


simple_overflow( buffer:node, access:node )
simple_overflow( buffer, access ) :- \
    static_sized_buffer( buffer, size ), \
    loop( l, c, _ ), \
    arraySubscriptE( access , ras, las ), \
    anc( l, access ), \
    varE( ras, buffer ), \
    varE( las, iter ), \
    bad_bound( c, iter, size ).


bad_bound( c, i, s ) :- anc(c,ce), leqE( ce, l, r ), varE( l, i ), intL( r, b ), s < b.
bad_bound( c, i, s ) :- anc(c,ce), geqE( ce, l, r ), varE( r, i ), intL( l, b ), s < b.


simple_overflow( buffer, access )?

